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


307

我正在将以下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的响应,但是其他两种方法从未运行。这是为什么?

Answers:


479

我认为您正在将response对象的使用与的使用混为一谈request

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

如果您使用的是有效的JSON并通过进行发布Content-Type: application/json,则可以使用bodyParser中间件解析请求正文并将结果放入request.body您的路由中。

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 4+更新

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.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);

21
request.body.MyKey
Pero P.

5
因为串联toString()是在对象上调用的。看一下的节点docs console.log,因为它检查对象并返回字符串表示形式。
Pero P.

13
console.log('request =' + JSON.stringify(request.body))
Pero P.

3
电流console.log()将自动对对象进行字符串化(通过util.inspect()),因此可以正常工作:console.log("with request", request.body);
Tommy Stanton

4
这个答案已经过时了,但是@chrisarton的答案是最新的。
埃米尔·英格斯列夫

209

对于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()
})

23
他们为什么不断取出每个人都用的东西?
light24bulbs 2014年

11
@ light24bulbs因此,对于那些不使用/不需要它的人来说,它(快速)将变得更加苗条和有意义。
andyengle 2014年

6
@andyengle确实有道理。但是我认为几乎每个人都使用请求解析。对我来说,这似乎是一个核心功能。
light24bulbs 2014年

23
由于中间件功能接口是许多库使用的标准,因此它也允许不使用Express的应用程序使用这些中间件功能。
2015年

3
出于快递目的,不允许不使用请求的应用程序使用它。他们可以将其分开,并默认包含在express中。
JJ

18

有时,您不需要第三方库来解析文本中的JSON。有时,您需要使用以下JS命令,首先尝试它:

        const res_data = JSON.parse(body);

3
最初的问题是关于从Express框架中的POST消息中解析JSON。如果没有BodyParser中间件,则JSON数据将不存在于请求对象的body属性中。
ThisClark

1
解析服务器响应时,我发现这很有用。谢谢!
哈桑·阿尔萨瓦迪

1
谢谢哈桑,谢谢您的评论。当我在寻找解决方案并遇到这篇文章时,它确实对我有所帮助。不知道它是否在所有情况下都有效,但是在某些情况下肯定可以使用,并且比使用第三方库更好。
xims,2016年

1
您的答案和评论为答案提供了更多信息(更多信息在此处是您的答案)。您应该更新您的答案以表示express需要正文分析器,或者给出替代方案来表示正文分析器如何首先获取数据。
dewwwald '16

2
没有定义body
jameshfisher

15

对于那些在里面得到空物体的人 req.body

我忘 headers: {"Content-Type": "application/json"} 了提出要求。更改它可以解决问题。


不敢相信我错过了!我一直在发送text/json{}作为回应。我全权监督。非常有帮助。
James M. Lay

gh-我也错过了。感谢您发布此信息,这样我就不会浪费更多的时间了!
史蒂夫·戈麦斯

9

@Daniel汤普森提到,他已经忘记了添加{“内容类型”:“应用/ 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);
});

7

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.