【问题标题】:How do I consume the JSON POST data in an Express application如何在 Express 应用程序中使用 JSON POST 数据
【发布时间】:2012-04-17 20:31:37
【问题描述】:

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

【问题讨论】:

    标签: json node.js express


    【解决方案1】:

    我认为您将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 的早期版本 (

    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"}
    

    【讨论】:

    • 如何访问“MyKey”以获得“My Value”?
    • 因为连接在对象上调用toString()。查看console.log 的节点文档,因为它会检查对象并返回字符串表示形式。
    • console.log('request =' + JSON.stringify(request.body))
    • 当前的console.log() 将自动对对象进行字符串化(通过util.inspect()),所以这会起作用:console.log("with request", request.body);
    • 这个答案已经过时,但来自@chrisarton 的答案是最新的。
    【解决方案2】:

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

    【讨论】:

    • 他们为什么老是拿出大家用的东西?
    • @light24bulbs 所以它(Express)对于那些不使用/不需要它的人来说会更加精简和意味着。
    • @andyengle 这确实有道理。但我认为几乎每个人都使用请求解析。这对我来说似乎是一个核心功能。
    • 由于中间件函数接口是很多库使用的标准,所以也允许不使用Express的应用使用这些中间件函数。
    • 将其从 express 中取出并不允许它被不使用请求的应用程序使用。他们本可以将其分开,并默认将其包含在 express 中。
    【解决方案3】:

    有时您不需要第三方库来解析文本中的 JSON。 有时候你只需要下面的JS命令,先试试吧:

            const res_data = JSON.parse(body);
    

    【讨论】:

    • 最初的问题是关于从 Express 框架中的 POST 消息中解析 JSON。如果没有 BodyParser 中间件,请求对象的 body 属性中将不存在 JSON 数据。
    • 我发现这在解析服务器响应时很有用。谢谢!
    • 谢谢哈桑,感谢您的评论。当我在寻找解决方案并遇到这篇文章时,它确实帮助了我。不确定它是否适用于所有情况,但肯定适用于某些情况,并且它是比使用第三方库更好的解决方案。
    • 您的答案和评论为答案提供了更多信息(更多信息是您的答案)。您应该更新您的答案以表明 express 需要 body-parser 或提供替代方案以表明 body-parser 首先是如何获取数据的。
    • 没有定义body
    【解决方案4】:

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

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

    【讨论】:

    • 哇,谢谢!救生员!直接在命令行上调用 lambda 时容易忘记! serverless invoke local -f app -l -d '{ "path": "/conferences", "httpMethod": "POST", "body": { "conference_name": "test" }, "headers": {"Content-Type": "application/json"} }'
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      @Daniel Thompson 提到他忘记在 request 中添加 {"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);
      });
      

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-09
          • 1970-01-01
          • 2015-11-12
          • 2015-07-04
          • 2016-01-01
          • 1970-01-01
          相关资源
          最近更新 更多