Expressjs生体

And*_*Kon 50 node.js express

如何访问expressjs给我的请求对象的原始主体?

var express = require('./node_modules/express');
var app = express.createServer();
app.post('/', function(req, res)
{
    console.log(req.body); //says 'undefined'
});
app.listen(80);
Run Code Online (Sandbox Code Playgroud)

ste*_*ewe 54

这样的事情应该有效:

var express = require('./node_modules/express');
var app = express.createServer();
app.use (function(req, res, next) {
    var data='';
    req.setEncoding('utf8');
    req.on('data', function(chunk) { 
       data += chunk;
    });

    req.on('end', function() {
        req.body = data;
        next();
    });
});

app.post('/', function(req, res)
{
    console.log(req.body);
});
app.listen(80);
Run Code Online (Sandbox Code Playgroud)

  • `bodyParser()`中间件曾经有`.rawBody`但已被删除:https://github.com/senchalabs/connect/commit/c3170eee8cd60c92bcccca6054c1ebbb93a1a821#diff-0 (6认同)
  • 看起来这个解决方案在Express 4中不再起作用了. (5认同)
  • 你建议我做ExpressJs已经做过的同样的工作!必须有办法把那该死的生体拉出来. (2认同)
  • @AndreyKon Nope.这通常不是你想要的东西.Node非常注重尽可能使用流. (2认同)

Zug*_*alt 34

使用bodyParser.text()中间件将文本正文放入req.body.

app.use(bodyParser.text({type: '*/*'}));
Run Code Online (Sandbox Code Playgroud)

如果要将文本正文处理限制为某些路径或发布内容类型,您也可以这样做.

app.use('/routes/to/save/text/body/*', bodyParser.text({type: 'text/plain'})); //this type is actually the default
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
Run Code Online (Sandbox Code Playgroud)

如果你想要原料Buffer,你可以使用bodyParse.raw().

app.use(bodyParser.raw({type: '*/*'}));
Run Code Online (Sandbox Code Playgroud)

注意:这个答案是针对节点v0.12.7,表达4.13.2和正文解析器1.13.3进行测试的.

  • 这应该是正确的答案.其余的已经过时了. (3认同)
  • 这对我有用.我需要处理xml体,所以我使用了以下行:`app.use(bodyParser.text({type:'*/xml'}));`很好地填充了我的req.body. (2认同)

Ben*_*air 27

将以下中间件放在bodyParser中间件之前.它将在request.rawBody中收集原始身体数据,不会干扰bodyParser.

app.use(function(req, res, next) {
    var data = '';
    req.setEncoding('utf8');
    req.on('data', function(chunk) { 
        data += chunk;
    });
    req.on('end', function() {
        req.rawBody = data;
        next();
    });
});
app.use(express.bodyParser());
Run Code Online (Sandbox Code Playgroud)

  • 我认为你需要移动下一个(); 在req.on里面调用('end'..回调函数. (2认同)

log*_*yth 20

express除非您添加中间件,否则默认不会缓冲数据.简单的解决方案是遵循@ Stewe下面的答案中的示例,它将自己连接所有数据.例如

var concat = require('concat-stream');
app.use(function(req, res, next){
  req.pipe(concat(function(data){
    req.body = data;
    next();
  }));
});
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是,您现在已将所有POST正文内容作为连续的块移动到RAM中,这可能不是必需的.另一个值得考虑的选项,但取决于您需要在帖子正文中处理多少数据,而是将数据作为流处理.

例如,使用XML,您可以使用支持解析XML的XML解析器,因为它以块的形式出现.一个这样的解析器是XML Stream.你做这样的事情:

var XmlStream = require('xml-stream');

app.post('/', function(req, res) {
  req.setEncoding('utf8');
  var xml = new XmlStream(req);
  xml.on('updateElement: sometag', function(element) {
    // DO some processing on the tag
  });
  xml.on('end', function() {
    res.end();
  });
});
Run Code Online (Sandbox Code Playgroud)

  • 我对bodyParser无论如何收集身体块感到恼火,但如果bodyParser无法解析它们,则不会将它们交给我.这是不合逻辑的行为.我认为在使用中间件框架时,应该向开发人员隐藏处理流. (4认同)
  • 伙计,我们在这里提供帮助,没有理由听起来如此生气.盲目缓冲数据是没有意义的,如果您真正花时间了解Node的工作方式,那么自己动手做很容易.这里的每个答案都解释了如何做到这一点 (2认同)

Dee*_*xel 8

所有的答案似乎都已经过时了,如果有人仍在为此苦苦挣扎,那么 Express 内置了Express raw middeware

此中间件在 Express v4.16.0 及更高版本中可用。这是Express中内置的中间件功能。它使用 JSON 有效负载解析传入请求,并且基于 body-parser。

var express = require("express");
var app = express();

app.use(express.raw({ type: "*/*" }))

app.post("/", (req, res) => {
  // req.body = JSON.parse(req.body); // To parse JSON if needed (in-case)
  console.log(req.body);
  res.end();
});

app.listen(3000, (err) => {
if(!err) console.log("App running!!")
});
Run Code Online (Sandbox Code Playgroud)


Tar*_*ill 7

因此,如果content-type设置为以下任一项,Express的bodyParser似乎只解析传入的数据:

  1. application/x-www-form-urlencoded
  2. application/json
  3. multipart/form-data

在所有其他情况下,它甚至不打扰阅读数据.

你可以换行号.92的express/node_modules/connect/lib/middleware/bodyParser.js来自

} else {
        next();
}
Run Code Online (Sandbox Code Playgroud)

至:

} else {
        var data='';
        req.setEncoding('utf8');
        req.on('data', function(chunk) { 
           data += chunk;
        });

        req.on('end', function() {
            req.rawBody = data;
            next();
        });
}
Run Code Online (Sandbox Code Playgroud)

然后,req.rawBody从您的代码中读取.

  • 修改连接真的不是一个很好的方法来做到这一点,虽然它会工作.正如@ Stewe的回答所示,您可以轻松添加自己的中间件,而不必修改任何外部库. (2认同)

poo*_*per 7

app.use(bodyParser.json({
    verify: function (req, res, buf, encoding) {
        req.rawBody = buf;
    }
}));
app.use(bodyParser.urlencoded({
    extended: false,
    verify: function (req, res, buf, encoding) {
        req.rawBody = buf;
    }
}));
Run Code Online (Sandbox Code Playgroud)


JCH*_*H2k 6

现在这似乎变得容易了很多

body-parser 模块现在能够解析原始数据和文本数据,这使得任务成为单线任务:

app.use(bodyParser.text({type: 'text/plain'}))
Run Code Online (Sandbox Code Playgroud)

或者

app.use(bodyParser.raw({type: 'application/binary'}))
Run Code Online (Sandbox Code Playgroud)

这两行都只是简单地填充了body属性,所以用res.body. bodyParser.text()会给你 UTF8 字符串,同时bodyParser.raw()会给你原始数据。

这是文本/纯数据的完整代码:

var express = require('express')
var bodyParser = require('body-parser')
var app = express()

app.use(bodyParser.text({type: 'text/plain'}))

app.post('/', function (req, res, next) {
    console.log('body:\n' + req.body)

    res.json({msg: 'success!'})

    next()
})
Run Code Online (Sandbox Code Playgroud)

有关完整文档,请参见此处:https : //www.npmjs.com/package/body-parser

我使用了 express 4.16 和 body-parser 1.18


Tec*_*eer 5

如果您在使用上述解决方案时遇到问题干扰正常的帖子请求,这样的事情可能会有所帮助:

app.use (function(req, res, next) {
    req.rawBody = '';
    req.setEncoding('utf8');
    req.on('data', function(chunk) { req.rawBody += chunk });
});
Run Code Online (Sandbox Code Playgroud)

更多信息和来源:https://github.com/visionmedia/express/issues/897#issuecomment-3314823

  • 你最后忘记了`next();`.添加它时,它对我有用. (6认同)

Ber*_*mos 5

如果您希望身体作为缓冲:

var rawParser = function(req, res, next) {
    var chunks = [];
    req.on('data', function(chunk) { 
        chunks.push(chunk)
    });
    req.on('end', function() {
        req.body = Buffer.concat(chunks);
        next();
    });
}
Run Code Online (Sandbox Code Playgroud)

要么

var rawParser = bodyParser.raw({type: '*/*'});
Run Code Online (Sandbox Code Playgroud)

然后:

app.put('/:name', rawParser, function(req, res) {
  console.log('isBuffer:', Buffer.isBuffer(req.body));
})
Run Code Online (Sandbox Code Playgroud)

或所有路线:

app.use(bodyParser.raw({type: '*/*'}));
Run Code Online (Sandbox Code Playgroud)