使用 Express 获得一个空的身体

Posted

技术标签:

【中文标题】使用 Express 获得一个空的身体【英文标题】:Getting an empty body using Express 【发布时间】:2020-06-08 11:30:49 【问题描述】:

我目前正在使用 express 来处理 POST 请求,但是当我使用 node-fetch 进行 POST 时,我发送了一个正文,然后我 console.log() express(服务器代码)中收到的正文。我得到一个空对象。不知道为什么会这样,我将在下面包含我的代码。

服务器代码

const express = require('express');
const bodyParser = require("body-parser");

const app = express();
app.use(bodyParser.urlencoded( extended: true ));

// GET method route
app.get('/api/getHeartCount', function (req, res) 
    res.send('GET request')
);

  // POST method route
app.post('/api/sendHeart', function (req, res) 
    res.sendStatus(200);
    let fBody = JSON.stringify(req.body);
    console.log("Got body: " + fBody); // When this is run, I get this in the console: Got body: 
);

app.listen(3000);

POST 请求代码

const fetch = require("node-fetch");

(async () => 
    const body =  heartCount: 1 ;

    const response = await fetch('http://localhost:3000/api/sendHeart', 
        method: "post",
        body: JSON.stringify(body)
    );
    const res = await response.text();

    console.log(res);
)();

【问题讨论】:

你可以试试method: "POST" 【参考方案1】:

你使用了错误的bodyParser

您必须像这样使用 bodyParser.json() 中间件才能解析 json 并访问 req.body 中的正文

// this snippet will enable bodyParser application wide
app.use(bodyParser.json())

// you can also enable bodyParser for a set of routes if you don't need it globally like so

app.post('/..', bodyParser.json())

// or just for a set of routes
router.use(bodyParser.json()

bodyParser.json([选项]) 返回仅解析 json 并且仅查看 Content-Type 标头与 type 选项匹配的请求的中间件。此解析器接受正文的任何​​ Unicode 编码,并支持 gzip 和 deflate 编码的自动膨胀。

在中间件之后的请求对象上填充一个包含解析数据的新主体对象(即 req.body)。

来自:https://www.npmjs.com/package/body-parser#bodyparserjsonoptions

注意:如果您要发送 json 类型的正文,请不要忘记将 Content-Type: application/json 添加到您的请求中

更新:正如@ifaruki 所说,express 附带一个内置的json bodyParser,可通过express.json() 访问:https://expressjs.com/en/api.html#express.json

【讨论】:

【参考方案2】:

您应该解析请求的正文

app.use(express.json());

使用最新的快递版本,您不需要body-parser

【讨论】:

@Marino 是这样的 谢谢,非常感谢。

以上是关于使用 Express 获得一个空的身体的主要内容,如果未能解决你的问题,请参考以下文章

在 apollo-server-express 中增加身体限制大小

Node JS POST请求返回未定义的主体

如何使用内部元素填充获得完整的身体宽度?

Node.js Express 框架

mysql中有和Oracle中的nvl2(expr1,expr2,expr3)效果一样的函数么?

Nodejs Express新手教程&高手进阶