Expressjs原始请求体

69

我该如何访问由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);

这里稍微多一点的上下文会更有用。您期望在正文中收到什么类型的数据?您是想读取表单数据还是更复杂的内容? - loganfsmyth
4
我不确定我理解那会如何影响我获取原始数据的方式。假设那只是一些未知的二进制数据。 - Andrey Kon
4
同时,你只需要执行require('express')即可。它会自动找到该模块。 - loganfsmyth
1
但是如果数据是JSON或XML呢? - Andrey Kon
1
Tarandeep Gill,你不会相信我做了什么,哈哈,但我刚刚修改了bodyParser.js源代码,并带回了那行代码rawBody :) 所以现在我有了它。虽然对我来说似乎不太对,因为在这种情况下,我的代码只调用bodyParser来获取这个rawBody,这会导致执行很多我不需要的代码。从性能角度来看,这是不正确的。 - Andrey Kon
显示剩余3条评论
12个回答

3
请注意其他答案,如果您还希望支持JSON、URLEncoded等,则它们可能无法与bodyParser正常配合使用。为使其能够与bodyParser配合使用,您应该根据您关心的Content-Type头(就像bodyParser本身一样)来条件化处理程序的注册。
要将请求的Content-Type为"text/xml"的原始正文内容放入req.rawBody中,您可以执行以下操作:
app.use(function(req, res, next) {
  var contentType = req.headers['content-type'] || ''
    , mime = contentType.split(';')[0];

  if (mime != 'text/xml') {
    return next();
  }

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

0

发送请求时,请确保添加此标头

'Content-Type': 'application/json'

只有在使用中间件查找JSON内容类型并将数据作为纯文本提供而不解析它作为JSON时,这才可能有用。问题向我们展示没有使用任何中间件,更不用说那种非常奇怪的要求了。 - Quentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接