考虑对Node.js服务器的以下HTTP POST
调用:
curl -H "Content-Type: application/json" \
-X POST \
-d '{"jsonKey":"jsonValue"}' \
'http://localhost:8080?abcd=efgh'
我想访问POST请求的URL参数和JSON有效负载。
导入url.parse
:
var server = http.createServer(function(req, res) {
// Parse the params - prints "{ abcd: 'efgh' }"
var URLParams = url.parse(req.url, true).query;
console.log(URLParams);
// How do I access the JSON payload as an object?
}
但是如何使用本机Node.js库(没有任何npm
导入)访问JSON有效负载?
我尝试了什么
req
打印到console.log
,但未找到POST对象req
<{3}} 答案 0 :(得分:3)
来自文档:
当收到POST或PUT请求时,请求正文可能是 对您的应用程序很重要获取身体数据有点儿 比访问请求标头更复杂。请求对象 传入处理程序的实现ReadableStream接口。 就像其他流一样,可以在其他地方收听或传输此流 流。我们可以通过收听来直接从流中获取数据 流的'数据'和'结束'事件。
https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-body
var server = http.createServer(function(req, res) {
// Parse the params - prints "{ abcd: 'efgh' }"
var URLParams = url.parse(req.url, true).query;
console.log(URLParams);
// How do I access the JSON payload as an object?
var body = [];
req.on('data', function(chunk) {
body.push(chunk);
}).on('end', function() {
body = Buffer.concat(body).toString();
if (body) console.log(JSON.parse(body));
res.end('It Works!!');
});
});
答案 1 :(得分:1)
req
是一个流,因此您访问它的方式取决于您希望如何使用它。如果您只想将其作为文本获取并将其解析为JSON,则可以执行以下操作:
let data = "";
req.on("readable", text => data += text);
req.on("end", () => {
try {
const json = JSON.parse(data);
}
catch (err) {
console.error("request body was not JSON");
}
/* now you can do something with JSON */
});
答案 2 :(得分:1)
只是一个补充;如果您想从POST正文创建对象,则使用以下代码:
const body2Obj = chunk => {
let body = {};
let string = chunk.toString();
if (!string.trim()) return body;
string.split('&').forEach(param => {
let elements = param.split('=');
body[elements[0]] = elements[1];
});
return body;
};
然后使用上面stdob--所解释的方法:
var body = [];
req.on('data', chunk => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body);
body = body2Obj(body);
// ...
});
我更喜欢这种解决方案,而不是使用超大的第三方模块来仅解析请求的主体(有时,出于某些原因,人们建议这样做)。可能是我的版本较短。当然,这仅适用于url编码的格式化主体。