如何使用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调用它的时候,“按预期”工作。
您收到的错误与您向我们显示的任何代码没有任何关系。
如果你想得到原始的请求,为data
和end
事件request
处理程序(当然,删除express.bodyParser()
任何调用)。 请注意, data
事件将以块forms出现,除非您为data
事件设置编码,否则这些块将是缓冲区,而不是string。
尝试这个:
response.write(JSON.stringify(request.body));
这将采用bodyParser
为您创build的对象, bodyParser
其重新转换为string并将其写入响应。 如果你想要确切的请求体(具有相同的空格等),你将需要data
和end
监听器的请求之前,并build立了块的string块,你可以在连接的JSONparsing源代码中看到。
您使用以下代码来logging发布数据:
router.post("/users",function(req,res){ res.send(JSON.stringify(req.body, null, 4)); });