首页 文章

通过http.request发送帖子请求时,req.body为空

提问于
浏览
8

我有一个使用bodyparser()的nodejs应用程序,以及这条路线:

app.post('/users', function(req, res){
  res.json(req.body)
})

当我卷曲

curl -X POST 127.0.0.1:3000/users -d 'name=batman'

服务器发回这个json:

{ name: 'batman' }

我的问题是当试图用http.request做同样的请求时,req.body是空的我虽然做同样的调用,这里是一个我用节点运行的test.js文件:

var http = require('http');

var options = {
  host: '127.0.0.1',
  port: 3000,
  path: '/api/users',
  method: 'POST'
};

var request = http.request(options, function (response) {
  var str = '';
  response.on('data', function (chunk) {
    str += chunk;
  });

  response.on('end', function () {
    console.log(str);
  });
});

request.end("name=batman");

请求正文是空的 - > {}

为什么?我已经尝试设置内容长度,但没有做任何事情 .

2 回答

  • 15

    你需要传递 Content-Type 来告诉 bodyParser() 使用哪个解析器 . 对于常规表单数据,您应该使用 Content-Type: application/x-www-form-urlencoded ,因此:

    var options = {
      host: '127.0.0.1',
      port: 3000,
      path: '/api/users',
      method: 'POST',
      'Content-Type': 'application/x-www-form-urlencoded'
    };
    

    应该做的伎俩 .

    Edit: 如果你发现自己在节点中做了很多客户端HTTP请求,我衷心地推荐Mikeal Rogers' request module,这使得这些事情变得轻而易举 .

  • 0

    确保 app.jsserver.js 中存在这些行

    var bodyParser = require('body-parser');
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({extended: false}));
    

相关问题