使用Node.js和Express进行POST时如何访问请求体?

The*_*Sky 149 javascript 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();
});
Run Code Online (Sandbox Code Playgroud)

现在,如果我发布类似的东西:

curl -d user=Someone -H Accept:application/json --url http://localhost:5000
Run Code Online (Sandbox Code Playgroud)

Someone按预期得到了.现在,如果我想获得完整的请求体,该怎么办?我尝试过response.write(request.body)但是Node.js会抛出一个异常,说" 第一个参数必须是字符串或缓冲区 ",然后进入"无限循环",异常显示" 无法在发送后设置标头. "; 即使我做了var reqBody = request.body;然后写作也是如此response.write(reqBody).

这是什么问题?

另外,我可以在不使用的情况下获得原始请求express.bodyParser()吗?

Hec*_*rea 138

Express 4.0及以上版本:

$ npm install --save body-parser

然后在您的节点应用程序中:

const bodyParser = require('body-parser');
app.use(bodyParser);
Run Code Online (Sandbox Code Playgroud)

Express 3.0及以下版本:

尝试在你的cURL调用中传递它:

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

并确保您的数据是JSON格式:

{"user":"someone"}

此外,您可以在node.js代码中使用console.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);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 在Express 4.x中不推荐使用`express.bodyParser()`.请改用https://www.npmjs.org/package/body-parser. (34认同)
  • 从快递4.16.0或更高版本开始,可以用这种方式在app.use()中使用express.json()=> app.use(express.json()); (7认同)

rus*_*tyx 124

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

app.use(express.json())
Run Code Online (Sandbox Code Playgroud)

像这样:

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

注意 - body-parser这取决于它,已包含在express中.

另外不要忘记发送标题 Content-Type: application/json

  • 谢谢,这是4.16+的最佳答案.没有其他依赖,像魅力一样! (10认同)
  • 确认`v4.16.3`,这个解决方案正在运行 (4认同)
  • 我能找到的最好/唯一的解决方案不需要正文解析器 (3认同)
  • 现在这是正确的答案。`v4.16.x` (2认同)
  • 我不需要“body-parser”,而是内置的“app.use(express.json())”。然后是 `curl` 请求中 `-H "Content-Type: application/json"` 的存在最终使它起作用。 (2认同)

Wal*_*man 40

从Express 4开始,以下代码似乎可以解决问题.请注意,您需要body-parser使用安装npm.

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

  • 对于解析json体,需要添加以下行`app.use(bodyParser.json())` (29认同)
  • 只是一张纸条.不得不使用`app.use(bodyParser.urlencoded({extended:true}));`AND`app.use(bodyParser.json())`来获取使用NodeJS和Express的AWS Linux服务器上的json数据. (3认同)

小智 29

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


Gau*_*tam 24

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

这会对你有所帮助.我假设你在json发送尸体.


Had*_*Mir 14

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

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

app.use(express.json()) //Notice express.json middleware
Run Code Online (Sandbox Code Playgroud)

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

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

app.post('/', (req, res) => {
  console.log(req.body)
})
Run Code Online (Sandbox Code Playgroud)


Des*_*web 10

就我而言,我缺少设置标题

"Content-Type: application/json"


Man*_*nan 7

此,可以实现无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();
    });
});
Run Code Online (Sandbox Code Playgroud)