关于node.js:如何在Express应用程序中使用JSON POST数据

How do I consume the JSON POST data in an Express application

我将以下JSON字符串发送到我的服务器。

1
2
3
4
5
6
7
8
9
10
(
        {
        id = 1;
        name = foo;
    },
        {
        id = 2;
        name = bar;
    }
)

在服务器上我有这个。

1
2
3
4
5
6
7
8
9
10
11
12
13
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的主体。请参阅此答案,提供一些指导。

如果您使用的是有效的JSON并使用Content-Type: application/json进行POST,那么您可以使用bodyParser中间件来解析请求正文并将结果放在路径的request.body中。

1
2
3
4
5
6
7
8
9
10
11
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);

按照以下方式进行测试:

1
2
$ curl -d '{"MyKey":"My Value"}' -H"Content-Type: application/json" http://127.0.0.1:3000/
{"MyKey":"My Value"}

针对Express 4+进行了更新

在v4之后,正文解析器被拆分为它自己的npm包,需要单独安装npm install body-parser

1
2
3
4
5
6
7
8
9
10
11
12
13
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.16+更新

从4.16.0版开始,可以使用新的express.json()中间件。

1
2
3
4
5
6
7
8
9
10
11
12
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 v4 +

从npm安装body-parser。

1
$ npm install body-parser

https://www.npmjs.org/package/body-parser#installation

1
2
3
4
5
6
7
8
9
10
11
12
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命令,首先尝试:

1
        const res_data = JSON.parse(body);


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

这个app.use(express.json)现在可以让你读取传入的帖子JSON对象


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

我忘记了设置
headers: {"Content-Type":"application/json"}
在请求中。改变它解决了这个问题。


@Daniel Thompson提到他忘记在请求中添加{"Content-Type":"application / json"}。他能够更改请求,但是,并不总是可以更改请求(我们正在这里处理服务器)。

在我的情况下,我需要强制内容类型:text / plain被解析为json。

如果您无法更改请求的内容类型,请尝试使用以下代码:

1
app.use(express.json({type: '*/*'}));

而不是全局使用express.json(),我更喜欢只在需要的地方应用它,例如在POST请求中:

1
2
3
4
app.post('/mypost', express.json({type: '*/*'}), (req, res) => {
  // echo json
  res.json(req.body);
});