我将以下 JSON 字符串发送到我的服务器。
(
{
id = 1;
name = foo;
},
{
id = 2;
name = bar;
}
)
在服务器上我有这个。
app.post('/', function(request, response) {
console.log("Got response: " + response.statusCode);
response.on('data', function(chunk) {
queryResponse+=chunk;
console.log('data');
});
response.on('end', function(){
console.log('end');
});
});
当我发送字符串时,它显示我收到了 200 响应,但其他两种方法从未运行。这是为什么?
我认为您将 response
对象的使用与 request
的使用混为一谈。
response
对象用于将 HTTP 响应发送回调用客户端,而您想要访问 request
的主体。请参阅此answer,它提供了一些指导。
如果您使用有效的 JSON 并使用 Content-Type: application/json
发布它,那么您可以使用 bodyParser
中间件来解析请求正文并将结果放在路由的 request.body
中。
Express 4.16+ 的更新
从 4.16.0 版开始,可以使用新的 express.json()
中间件。
var express = require('express');
var app = express();
app.use(express.json());
app.post('/', function(request, response){
console.log(request.body); // your JSON
response.send(request.body); // echo the result back
});
app.listen(3000);
为 Express 4.0 - 4.15 更新
正文解析器在 v4 之后被拆分为它自己的 npm 包,需要单独安装 npm install body-parser
var express = require('express')
, bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.json());
app.post('/', function(request, response){
console.log(request.body); // your JSON
response.send(request.body); // echo the result back
});
app.listen(3000);
对于 Express 的早期版本 (< 4)
var express = require('express')
, app = express.createServer();
app.use(express.bodyParser());
app.post('/', function(request, response){
console.log(request.body); // your JSON
response.send(request.body); // echo the result back
});
app.listen(3000);
沿着以下路线进行测试:
$ curl -d '{"MyKey":"My Value"}' -H "Content-Type: application/json" http://127.0.0.1:3000/
{"MyKey":"My Value"}
对于 Express v4+
从 npm 安装 body-parser。
$ npm install body-parser
https://www.npmjs.org/package/body-parser#installation
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
// parse application/json
app.use(bodyParser.json())
app.use(function (req, res, next) {
console.log(req.body) // populated!
next()
})
对于那些在 req.body
中获得空对象的人
我忘记在请求中设置 headers: {"Content-Type": "application/json"}
。改变它解决了这个问题。
serverless invoke local -f app -l -d '{ "path": "/conferences", "httpMethod": "POST", "body": { "conference_name": "test" }, "headers": {"Content-Type": "application/json"} }'
@Daniel Thompson 提到他忘记在请求中添加 {"Content-Type": "application/json"}。他能够更改请求,但是,更改请求并不总是可能的(我们正在这里的服务器上工作)。
就我而言,我需要强制将 content-type: text/plain 解析为 json。
如果您无法更改请求的内容类型,请尝试使用以下代码:
app.use(express.json({type: '*/*'}));
而不是全局使用 express.json() ,我更喜欢只在需要的地方应用它,例如在 POST 请求中:
app.post('/mypost', express.json({type: '*/*'}), (req, res) => {
// echo json
res.json(req.body);
});
有时您不需要第三方库来解析文本中的 JSON。有时你只需要下面的 JS 命令,先试试吧:
const res_data = JSON.parse(body);
body
常量表达 = 要求(“表达”);让应用程序=快递(); app.use(express.json());
这个 app.use(express.json) 现在可以让你读取传入的 JSON 对象
初学者的错误...我在 本地模块 中使用 app.use(express.json());
而不是 主文件(入口点)。
toString()
。查看console.log
的节点文档,因为它检查对象并返回字符串表示。console.log('request =' + JSON.stringify(request.body))
console.log()
将自动对对象进行字符串化(通过util.inspect()
),所以这会起作用:console.log("with request", request.body);