web-dev-qa-db-ja.com

リクエストボディはKOAで定義されていません

私は [〜#〜] koa [〜#〜] 以下のように:

var koa = require('koa'),
bodyParser = require('koa-body-parser'),
router = require('koa-router'),
app = koa();
app.use(router(app));
app.use(bodyParser());
app.post('http://localhost/get',getit);

function *getit(){
 console.log(this.req.body); //undefined
}

次に、jqueryajaxを介して投稿リクエストを送信します。

 var xhr = $.ajax({
            type: 'POST',
            dataType: 'json',
            contentType: 'application/json',
            url: 'http://localhost/getit',
            data: {"name":"me"},
            success: function(response) {

            }
        });

しかし、コアとthis.reqデータが見つかりません。グーグルでchrome開発者ツール私はヘッダーを見ることができ、すべてが正常に送信されますが、koaではそれを見ることができません。

更新

正しいのは:

   function *getit(){
 console.log(this.request.body); //undefined
}
12
MBehtemam

興味深いことに、同じエラーが発生しましたが、問題はapp.use()ステートメントの順序でした。以下は私には機能せず、this.request.bodyに対して「undefined」を返します。

var koa = require('koa');
var router = require('koa-router');
var bodyParser = require('koa-body-parser');

var app = koa();
app.use(router(app));
app.use(bodyParser());

app.post('/login', function *() {
    this.response.body = this.request.body;
});

app.listen(3000);

ただし、2つのapp.use()ステートメントの順序を逆にすると、次のようになります。

app.use(bodyParser());
app.use(router(app));

次に、this.request.bodyの要素を確認できます。私はkoav0.5.5、koa-body-parser v1.0.0、koa-router v3.1.2、およびノー​​ドv0.11.12を使用しています。

18
wrentech

代わりに co-body モジュールを使用します(koa-body-parserによって内部的に使用されるのと同じモジュール)。コードは次のようになります。

_var koa = require('koa');
var _ = require('koa-route');
var parse = require('co-body');

var app = koa();

app.use(function* (next) {
  this.req.body = yield parse(this);
  yield next;
});

app.use(_.post('/login', function* () {
    this.body = this.req.body;
}));

app.listen(3000);
_

var body = yield parse(this);行がトリックを実行します。parseメソッドはすべてのリクエストを解析しようとしますが、さらに必要な場合は_parse.json_、_parse.form_、または_parse.text_に置き換えることができます。コントロール

5
satanas

koaは、ミドルウェアを初期化した順序で使用します。したがって、bodyparserの前にルーターを挿入すると、ルーターは機能しません。リクエストはルーターミドルウェアに到達する前にパーサーに渡されないため、リクエストは解析されず、koaはrequest.bodyを無視します。したがって、順序付けは非常に重要です。

1
Rei Dien

解決策

コメントによると、私にとって正しいのはthis.request.bodyおよびthis.req.bodyが正しくありません。

0
MBehtemam