1

koajs サーバーに次のリクエストを送信しています。

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

しかし、サーバー側this.request.bodyでは常に未定義です。

リクエスト タイプを POST に変更すると、正常に動作します。

何か案は?


編集

を使用してkoa-routeいます。


編集2

を使用していることに気付きましたkoa-body-parser。これはおそらくより関連性があります。

4

1 に答える 1

1

koa-body パーサーを使用してみてください。

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

koa-router は、典型的なリクエスト内容、URL パラメータ、フォームなどを解析すると思います。JSON オブジェクトを含むリクエストの本文を解析する場合は、ミドルウェアを適用する必要があります (alex がほのめかしたように)。

また、有効な JSON を配置しているかどうかも確認してください。

この 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;
  };

JSONの量には1MBの制限があるようです。次に 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);
      }
    });
  }
};
于 2014-10-22T01:07:28.770 に答える