如何使用Node.js和Express进行POST时访问请求体?

我有以下Node.js代码:

var express = require('express'); var app = express.createServer(express.logger()); app.use(express.bodyParser()); app.post('/', function(request, response) { response.write(request.body.user); response.end(); }); 

现在如果我发布像这样的东西:

 curl -d user=Someone -H Accept:application/json --url http://localhost:5000 

我按预期得到了Someone 。 现在,如果我想得到完整的请求体呢? 我试着做response.write(request.body)但Node.js抛出一个exception,说:“ 第一个参数必须是一个string或缓冲区 ”,然后进入一个“无限循环”,除了说:“ 无法设置标题后发送 “。 这也是正确的,即使我做了var reqBody = request.body; 然后写入response.write(reqBody)

这里有什么问题?

另外,我可以不使用express.bodyParser()吗?

Express 4.0及以上版本:

$ npm install --save body-parser

然后在你的节点应用程序中:

 const bodyParser = require('body-parser'); app.use(bodyParser); 

Express 3.0及以下版本:

尝试在你的cURL调用中传递这个:

--header "Content-Type: application/json"

并确保您的数据是JSON格式:

{"user":"someone"}

另外,可以在node.js代码中使用console.dir来查看对象中的数据,如下例所示:

 var express = require('express'); var app = express.createServer(); app.use(express.bodyParser()); app.post('/', function(req, res){ console.dir(req.body); res.send("test"); }); app.listen(3000); 

这另一个问题可能也有帮助: 如何接收JSON在express node.js POST请求?

如果你不想使用bodyParser检查这个其他问题: https ://stackoverflow.com/a/9920700/446681

从Express 4开始,下面的代码看起来有效。 请注意,您需要使用npm安装body-parser

 var express = require('express'); var bodyParser = require('body-parser'); var app = express(); app.use(bodyParser.urlencoded({ extended: false })); app.listen(8888); app.post('/update', function(req, res) { console.log(req.body); // the posted data }); 
 var express = require('express'); var bodyParser = require('body-parser'); var app = express(); app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()) var port = 9000; app.post('/post/data', function(req, res) { console.log('receiving data...'); console.log('body is ',req.body); res.send(req.body); }); // start the server app.listen(port); console.log('Server started! At http://localhost:' + port); 

这将帮助你。 我假设你正在发送json的身体。

你声称有什么“试着做”正是你在代码中写的,当你用curl调用它的时候,“按预期”工作。

您收到的错误与您向我们显示的任何代码没有任何关系。

如果你想得到原始的请求,为dataend事件request处理程序(当然,删除express.bodyParser()任何调用)。 请注意, data事件将以块forms出现,除非您为data事件设置编码,否则这些块将是缓冲区,而不是string。

尝试这个:

 response.write(JSON.stringify(request.body)); 

这将采用bodyParser为您创build的对象, bodyParser其重新转换为string并将其写入响应。 如果你想要确切的请求体(具有相同的空格等),你将需要dataend监听器的请求之前,并build立了块的string块,你可以在连接的JSONparsing源代码中看到。

您使用以下代码来logging发布数据:

 router.post("/users",function(req,res){ res.send(JSON.stringify(req.body, null, 4)); });