Search code examples
node.jsputkoa

Why is PUT request body undefined?


I'm making the following request to my koajs server:

$.ajax({
    type        : 'PUT',        // this.request.body undefined server side
    // type         : 'POST',   // this.request.body all good server side
    url         : url,
    data        : body,
    dataType    : 'json'
})

But on the server side this.request.body is always undefined.

If I change the request type to POST, it works fine.

Any ideas?


EDIT

I'm using koa-route.


EDIT 2

Just realised I'm using koa-body-parser, which is probably more relevant.


Solution

  • Try using the koa-body parser:

    const bodyParser = require('koa-bodyparser')
    app.use(bodyParser())
    

    I think koa-router will parse typical request stuff, url params, forms etc. If you want to parse the body of a request that contains a JSON object you need to apply a middleware (as alex alluded to).

    Also please check to see if you are putting valid JSON.

    Take a look at this Koa-bodyparser:

    /**
     * @param [Object] opts
     *   - {String} jsonLimit default '1mb'
     *   - {String} formLimit default '56kb'
     *   - {string} encoding default 'utf-8'
     */
    
      return function *bodyParser(next) {
        if (this.request.body !== undefined) {
          return yield* next;
        }
    
        if (this.is('json')) {
          this.request.body = yield parse.json(this, jsonOpts);
        } else if (this.is('urlencoded')) {
          this.request.body = yield parse.form(this, formOpts);
        } else {
          this.request.body = null;
        }
    
        yield* next;
      };
    

    there looks to be a 1mb limit on the amount of JSON. then to co-body/lib/json.js

    module.exports = function(req, opts){
      req = req.req || req;
      opts = opts || {};
    
      // defaults
      var len = req.headers['content-length'];
      if (len) opts.length = ~~len;
      opts.encoding = opts.encoding || 'utf8';
      opts.limit = opts.limit || '1mb';
    
      return function(done){
        raw(req, opts, function(err, str){
          if (err) return done(err);
    
          try {
            done(null, JSON.parse(str));
          } catch (err) {
            err.status = 400;
            err.body = str;
            done(err);
          }
        });
      }
    };