Nodejs expressjs获取request的body问题。用了bodyParser后,post没有生效

Nodejs expressjs获取request的body问题。用了bodyParser后,post没有生效

var express = require(‘express’);
var app = express();
app.listen(30001);
app.use(function(req, res, next) {
req.rawBody = ‘’;
req.setEncoding(‘utf8’);

req.on(‘data’, function(chunk) { req.rawBody += chunk; });

req.on(‘end’, function() { next(); }); }); app.use(express.bodyParser()); app.post("/ajax",function(req,res) { res.send(“post”); } );

post的时候,设置Content-Type为application/x-www-form-urlencoded 就不会有响应,如果设置其它的content-type就没有问题

我稍微看了一下express源码,貌似问题出在下面这个文件里面 \node_modules\express\node_modules\connect\lib\middleware\urlencoded.js 这个文件里面的

    limit(req, res, function(err){

if (err) return next(err); var buf = ‘’; console.log(‘urlencoded’);//这句话会执行 req.setEncoding(‘utf8’); req.on(‘data’, function(chunk){ buf += chunk;}); req.on(‘end’, function(){

try {
  req.body = buf.length
    ? qs.parse(buf, options)
    : {};

} catch (err){
  err.body = buf;
    console.log(err);
  return next(err);
}
next();

}); });

data和end事件都没有执行,所有next()就没有继续下去了,求解。


6 回复

Nodejs expressjs获取request的body问题。用了bodyParser后,post没有生效

在使用Express处理POST请求时,有时可能会遇到bodyParser不起作用的情况,特别是当Content-Type设置为application/x-www-form-urlencoded时。下面是一些可能的原因及解决方案。

问题描述

当你在使用bodyParser中间件处理POST请求时,如果Content-Type设置为application/x-www-form-urlencoded,可能会发现请求没有被正确解析,导致没有响应。

示例代码

var express = require('express');
var bodyParser = require('body-parser'); // 引入body-parser中间件

var app = express();

// 使用bodyParser中间件来解析请求体
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.post('/ajax', function(req, res) {
    console.log(req.body); // 打印请求体
    res.send('Post received');
});

app.listen(30001, function() {
    console.log('Server is running on port 30001');
});

解释

  1. 引入body-parser

    var bodyParser = require('body-parser');
    

    这一步是为了引入body-parser中间件,它可以帮助我们解析请求体。

  2. 使用bodyParser中间件

    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(bodyParser.json());
    

    这里使用了两个中间件:

    • bodyParser.urlencoded({ extended: true }) 用于解析application/x-www-form-urlencoded类型的数据。
    • bodyParser.json() 用于解析application/json类型的数据。
  3. 处理POST请求

    app.post('/ajax', function(req, res) {
        console.log(req.body); // 打印请求体
        res.send('Post received');
    });
    

    在这里,我们定义了一个POST路由/ajax,并打印请求体req.body以验证是否成功解析。

常见问题

  • 如果你仍然遇到问题,请确保你的Content-Type头设置正确,并且数据格式也符合预期。
  • 确保在使用bodyParser之前已经正确引入并使用了它。
  • 如果你使用的是较旧版本的Express,可能需要升级到最新版本,因为bodyParser已经被内置到Express中。

通过以上步骤,你应该能够解决使用bodyParser时遇到的问题,并正确处理POST请求。


因为你在app.use(express.bodyParser());之前自己处理定义了一个app.use(function(req, res, next) 处理器,<pre>req.on(‘end’, function() { next(); });</pre>只有请求数据接收完成才会进入bodyParser处理器,但是bodyParser此时已经接收不到数据了,所有程序会永远停在这个地方.拿掉你自己定义的那个处理器,或者在req.on(‘data’, function(chunk) {里面也调用一下next()也可以.

但是我不能拿掉那个啊,我现在的目的就是要取到request的原始body

哦,错了在app.use(function(req, res, next) 最后加个next()应该可行

再end里面不需要next()了

根据你的描述,问题可能是由于旧版 bodyParser 中间件的使用方式不正确导致的。bodyParser 已经被废弃,你可以使用 express 自带的中间件 express.json()express.urlencoded() 来处理请求体。

以下是修改后的代码示例:

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

// 使用新的中间件
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

app.post("/ajax", function(req, res) {
    console.log(req.body); // 输出请求体
    res.send("post");
});

app.listen(30001, () => {
    console.log('Server is running on port 30001');
});

解释:

  1. 中间件顺序:确保在路由之前应用中间件。
  2. 使用新版中间件express.json() 用于解析 JSON 格式的请求体,express.urlencoded() 用于解析 application/x-www-form-urlencoded 格式的请求体。
  3. 调试信息:通过打印 req.body 可以验证是否成功解析了请求体。

这样可以解决你遇到的问题,并且代码更简洁、更易维护。

回到顶部