当使用Node.js和Express发布时,如何访问请求体?

我有以下Node.js代码:

var express = require('express');
var app = express.createServer(express.logger());
app.use(express.bodyParser());


app.post('/', function(request, response) {
response.write(request.body.user);
response.end();
});

现在如果我POST一些东西:

curl -d user=Someone -H Accept:application/json --url http://localhost:5000

我得到Someone,正如预期的那样。现在,如果我想要得到完整的请求体呢?我尝试做response.write(request.body),但Node.js抛出一个异常,说“第一个参数必须是字符串或Buffer”,然后进入一个“无限循环”,异常说“发送后不能设置标头。”;即使我做了var reqBody = request.body;,然后写了response.write(reqBody),这也是正确的。

这里的问题是什么?

另外,我能得到原始请求而不使用express.bodyParser()吗?

589660 次浏览

当您使用curl调用它时,您所声称“尝试过”的正是您在代码中所写的“按预期”工作的内容。

您得到的错误似乎与您向我们展示的任何代码都无关。

如果你想获得原始请求,在request上为dataend事件设置处理程序(当然,还要删除对express.bodyParser()的任何调用)。注意,data事件将以块的形式发生,除非你为data事件设置了编码,否则这些块将是缓冲区,而不是字符串。

Express 4.0及以上:

$ npm install --save body-parser

然后在你的节点应用中

const bodyParser = require('body-parser');
app.use(bodyParser);

Express 3.0及以下:

尝试在cURL调用中传递这个:

--header "Content-Type: application/json"

确保你的数据是JSON格式:

{"user":"someone"}

另外,你也可以使用控制台。在node.js代码中使用Dir查看对象内部的数据,如下例所示:

var express = require('express');
var app = express.createServer();


app.use(express.bodyParser());


app.post('/', function(req, res){
console.dir(req.body);
res.send("test");
});


app.listen(3000);

另一个问题可能也有帮助:如何在express node.js POST请求中接收JSON ?

如果你不想使用bodyParser,请检查另一个问题:https://stackoverflow.com/a/9920700/446681

试试这个:

response.write(JSON.stringify(request.body));

它将获取bodyParser为你创建的对象,并将其转换回字符串并将其写入响应。如果你想要确切的请求体(具有相同的空格等),你需要在请求之前附加dataend侦听器,并像你在Json解析源代码从连接中看到的那样,一个块一个块地构建字符串。

从Express 4开始,下面的代码就可以完成这个任务。 注意,你需要使用npm安装body-parser .

var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));




app.listen(8888);


app.post('/update', function(req, res) {
console.log(req.body); // the posted data
});

您使用以下代码来记录post数据:

router.post("/users",function(req,res){
res.send(JSON.stringify(req.body, null, 4));
});
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json())


var port = 9000;


app.post('/post/data', function(req, res) {
console.log('receiving data...');
console.log('body is ',req.body);
res.send(req.body);
});


// start the server
app.listen(port);
console.log('Server started! At http://localhost:' + port);

这对你有帮助。我假设你在json中发送body。

表达v4.16开始,不需要任何额外的模块,只需使用内置的JSON中间件:

app.use(express.json())

是这样的:

const express = require('express')


app.use(express.json())    // <==== parse request body as JSON


app.listen(8080)


app.post('/test', (req, res) => {
res.json({requestBody: req.body})  // <==== req.body will be a parsed JSON object
})

注意- body-parser,它所依赖的,是带有express的已经包括了

别忘了发送头文件Content-Type: application/json

这也可以在没有body-parser依赖的情况下实现,监听request:datarequest:end并在请求结束时返回响应,参考下面的代码示例。裁判:https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-body

var express = require('express');
var app = express.createServer(express.logger());


app.post('/', function(request, response) {


// push the data to body
var body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
// on end of data, perform necessary action
body = Buffer.concat(body).toString();
response.write(request.body.user);
response.end();
});
});

如果你懒得阅读发布的数据块。 您可以简单地粘贴下面的行 读取json.

.

下面是对于TypeScript,类似的操作也可以用于JS。

app.ts

 import bodyParser from "body-parser";
// support application/json type post data
this.app.use(bodyParser.json());
// support application/x-www-form-urlencoded post data
this.app.use(bodyParser.urlencoded({ extended: false }));

在接收POST调用的任意控制器中使用如下所示

userController.ts

 public async POSTUser(_req: Request, _res: Response) {
try {
const onRecord = <UserModel>_req.body;
/* Your business logic */
_res.status(201).send("User Created");
}
else{
_res.status(500).send("Server error");
}
};

_req。body应该解析你的json数据到你的TS模型。

2019年,你不需要安装body-parser

你可以使用:

var express = require('express');
var app = express();
app.use(express.json())
app.use(express.urlencoded({extended: true}))
app.listen(8888);
app.post('/update', function(req, res) {
console.log(req.body); // the posted data
});

我对JS和ES绝对是新手,但对我来说似乎是这样的:

JSON.stringify(req.body)

如果有什么问题请告诉我!

通过以下命令安装正文解析器

$ npm install --save body-parser

配置正文解析器

const bodyParser = require('body-parser');
app.use(bodyParser);
app.use(bodyParser.json()); //Make sure u have added this line
app.use(bodyParser.urlencoded({ extended: false }));

在我的例子中,我错过了设置标题:

"Content-Type: application/json"

你不应该使用body-parser,它已被弃用。试试这个吧

const express = require('express')
const app = express()


app.use(express.json()) //Notice express.json middleware

app.use()函数用于在指定的路径上挂载指定的中间件函数。它主要用于为应用程序设置中间件。

现在要访问主体,只需执行以下操作

app.post('/', (req, res) => {
console.log(req.body)
})

接受的答案只适用于与JSON格式兼容的主体。一般来说,主体可以使用

app.use(
Express.raw({
inflate: true,
limit: '50mb',
type: () => true, // this matches all content types
})
);

像张贴在这里req.body有一个Buffer类型,可以转换成所需的格式。

例如,通过:

let body = req.body.toString()

或通过以下方式转换成JSON:

let body = req.body.toJSON();