ChatGPT解决这个技术问题 Extra ChatGPT

如何在 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 响应,但其他两种方法从未运行。这是为什么?


M
Maciej Bledkowski

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

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

对于 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 中。
D
Daniel Thompson

对于那些在 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"} }'
a
anneb

@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);
});

x
xims

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

        const res_data = JSON.parse(body);

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

常量表达 = 要求(“表达”);让应用程序=快递(); app.use(express.json());

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


H
Hatim

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