如何在Express应用程序中使用JSON POST数据

我将以下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响应,但其他两个方法从未运行。为什么呢?

604955 次浏览

我认为你将response对象的使用与request对象的使用混为一谈。

response对象用于将HTTP响应发送回调用客户端,而您想要访问request的对象体。请参阅回答,它提供了一些指导。

如果你使用的是有效的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);

快速4.0 - 4.15更新

Body解析器在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()
})
有时候你不需要第三方库从文本中解析JSON。 有时候你只需要下面的JS命令,先试试它
        const res_data = JSON.parse(body);

对于那些在req.body中获得空对象的对象

我忘了设置 headers: {"Content-Type": "application/json"} 在请求中。

const express = require('express');
let app = express();
app.use(express.json());

这个app.use(express.json)现在将允许你读取传入的post 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);
});

初学者的错误……我在当地的模块中使用app.use(express.json());而不是主文件(入口点)。