Expressjs生体

时间:2012-03-29 06:33:57

标签: 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);

10 个答案:

答案 0 :(得分:51)

这样的事情应该有效:

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);

答案 1 :(得分:31)

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

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

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

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}));

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

app.use(bodyParser.raw({type: '*/*'}));

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

答案 2 :(得分:26)

将以下中间件放在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());

答案 3 :(得分:15)

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

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

这样做的缺点是,您现在已将所有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();
  });
});

答案 4 :(得分:7)

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

  1. application/x-www-form-urlencoded
  2. application/json
  3. multipart/form-data
  4. 在所有其他情况下,它甚至都不打算阅读数据。

    您可以更改行号。来自

    的express / node_modules / connect / lib / middleware / bodyParser.js的92
    } else {
            next();
    }
    

    要:

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

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

答案 5 :(得分:6)

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;
    }
}));

答案 6 :(得分:5)

如果您在上述解决方案遇到干扰正常发布请求时遇到问题,可能会有所帮助:

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

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

答案 7 :(得分:3)

请小心处理其他答案,因为如果您还希望同时支持json,urlencoded等,它们将无法正常使用bodyParser。要使其与bodyParser一起使用,您应该将处理程序设置为仅在你关心的Content-Type标题,就像bodyParser本身一样。

要将Content-Type: "text/xml"的{​​{1}}请求的原始内容转换为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();
  });
});

答案 8 :(得分:3)

如果你想将身体作为缓冲:

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();
    });
}

var rawParser = bodyParser.raw({type: '*/*'});

然后:

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

或所有路线:

app.use(bodyParser.raw({type: '*/*'}));

答案 9 :(得分:3)

现在看来现在变得更容易了

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

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

app.use(bodyParser.raw({type: 'application/binary'}))

这两行只是填充body属性,因此请使用res.body获取文本。 bodyParser.text()将为您提供UTF8字符串,bodyParser.raw()将为您提供

这是text / plain数据的完整代码:

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()
})

请参阅此处获取完整文档: conversations.members

我使用了express 4.16和body-parser 1.18