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

neu*_*cer 287 json node.js express

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

(
        {
        id = 1;
        name = foo;
    },
        {
        id = 2;
        name = bar;
    }
)
Run Code Online (Sandbox Code Playgroud)

在服务器上我有这个.

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');
    });
});
Run Code Online (Sandbox Code Playgroud)

当我发送字符串时,它显示我得到了200响应,但其他两种方法从未运行.这是为什么?

Per*_* P. 436

我认为你把response对象的使用与对象的使用混为一谈request.

response对象用于将HTTP响应发送回调用客户端,而您希望访问该主体request.请参阅此答案,提供一些指导.

如果您正在使用有效的JSON并使用它进行POST 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);
Run Code Online (Sandbox Code Playgroud)

按照以下方式进行测试:

$ curl -d '{"MyKey":"My Value"}' -H "Content-Type: application/json" http://127.0.0.1:3000/
{"MyKey":"My Value"}
Run Code Online (Sandbox Code Playgroud)

针对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);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

  • `request.body.MyKey` (18认同)
  • `console.log('request ='+ JSON.stringify(request.body))` (11认同)
  • 因为连接在对象上调用`toString()`.查看`console.log`的节点文档,检查对象并返回字符串表示. (4认同)
  • 这个答案已经过时了,但@chrisarton的答案是最新的. (4认同)
  • 当前的`console.log()`将自动对一个对象进行字符串化(通过`util.inspect()`),这样就可以了:`console.log("with request",request.body);` (3认同)

chr*_*ton 201

对于Express v4 +

从npm安装body-parser.

$ npm install body-parser
Run Code Online (Sandbox Code Playgroud)

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()
})
Run Code Online (Sandbox Code Playgroud)

  • 为什么他们一直在拿出每个人都用的东西? (22认同)
  • 由于中间件功能接口是许多库使用的标准,因此它还允许不使用Express的应用程序使用这些中间件功能. (22认同)
  • @ light24bulbs所以它(Express)对于那些不使用/不需要它的人来说会更精益. (10认同)
  • @andyengle这确实有道理.但我认为几乎每个人都使用请求解析.这似乎是我的核心功能. (6认同)
  • 从Express中取出它不允许不使用请求的应用程序使用它.他们本可以将它分开,并默认包含在express中. (3认同)
  • 当数据类型为 JSON 时,我的正文返回空 (2认同)

ann*_*neb 16

@Daniel汤普森提到,他已经忘记了添加{“内容类型”:“应用/ JSON”}的请求。他能够更改请求,但是,更改请求并不总是可能的(我们正在此处处理服务器)。

就我而言,我需要强制将 content-type: text/plain 解析为 json。

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

app.use(express.json({type: '*/*'}));
Run Code Online (Sandbox Code Playgroud)

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

app.post('/mypost', express.json({type: '*/*'}), (req, res) => {
  // echo json
  res.json(req.body);
});
Run Code Online (Sandbox Code Playgroud)


xim*_*ims 15

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

        const res_data = JSON.parse(body);
Run Code Online (Sandbox Code Playgroud)

  • 最初的问题是在Express框架中解析POST消息中的JSON.如果没有BodyParser中间件,JSON数据将不会存在于请求对象的body属性中. (3认同)
  • 没有定义`body` (2认同)

Dan*_*son 5

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

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

  • 不敢相信我错过了这个!我使用 `text/json` 发送并收到 `{}` 作为响应。完全监督我。很有帮助。 (2认同)
  • 哇谢谢!救星!直接在命令行上调用 lambda 时很容易忘记!`无服务器调用本地 -f app -l -d '{ "path": "/conferences", "httpMethod": "POST", "body": { "conference_name": "test" }, "headers": {"内容类型": "application/json"} }'` (2认同)

小智 5

const express = require('express');
let app = express();
app.use(express.json());
Run Code Online (Sandbox Code Playgroud)

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