【问题标题】:Request Body is undefined in KOA请求正文在 KOA 中未定义
【发布时间】:2014-04-04 13:54:12
【问题描述】:

我有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
}

然后通过 jquery ajax 发送一个帖子请求:

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

            }
        });

但在 koa 和 this.req 中我找不到我的数据。在 google chrome 开发者工具中,我可以看到标题,一切都可以发送,但我在 koa 中看不到。

更新

正确的是:

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

【问题讨论】:

  • bodyParser = require('koa-body-parser), 复制粘贴问题?那是一个未终止的文字字符串
  • 不,它不是复制粘贴,而是模拟我的问题。我正在修复 qoute。
  • 我认为它现在被称为 request 而不是像以前在 Express 中的 req。所以console.log(this.request.body); 应该可以解决你的问题。

标签: javascript jquery ajax node.js koa


【解决方案1】:

我会改用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.jsonparse.formparse.text,以防您需要更多控制

【讨论】:

    【解决方案2】:

    koa 按照你初始化它们的顺序使用中间件。因此,如果您在 bodyparser 之前插入路由器,它将无法工作。由于您的请求在到达路由器中间件之前不会传递给解析器,因此不会解析请求,并且 koa 将忽略 request.body。所以顺序真的很重要。

    【讨论】:

      【解决方案3】:

      有趣的是,我遇到了同样的错误,但我的问题是 app.use() 语句的顺序。以下不适用于我,并为 this.request.body 返回“未定义”:

      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);
      

      但是,如果我将两个 app.use() 语句的顺序颠倒为以下:

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

      然后我可以看到 this.request.body 中的元素。我正在使用 koa v0.5.5、koa-body-parser v1.0.0、koa-router v3.1.2 和 node v0.11.12。

      【讨论】:

        【解决方案4】:

        解决方案

        根据评论,对我来说正确的是this.request.bodythis.req.body 是不正确的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-11
          • 2020-04-13
          • 1970-01-01
          • 2023-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多