Node.js 通过http.request发出post请求时,req.body为空

Node.js 通过http.request发出post请求时,req.body为空,node.js,request,express,Node.js,Request,Express,我有一个使用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为空 不过,我正在执行相同的调用,下面是一

我有一个使用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文件,我使用node运行该文件:

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");
请求正文为空->
{}


为什么??我已尝试设置内容长度,但没有做任何操作。

您需要传递
内容类型
来告诉
bodyParser()
要使用哪个解析器。对于常规表单数据,应使用
内容类型: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'
};
我们应该做到这一点


编辑:如果您发现自己在node中执行了大量客户端HTTP请求,我衷心推荐,这使这些事情变得轻而易举。

确保这些行出现在您的
app.js
server.js

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