一尘不染

如何在Express中强制将请求正文解析为纯文本而不是json?

node.js

我正在像这样使用nodejs + Express(v3):

app.use(express.bodyParser());
app.route('/some/route', function(req, res) {
  var text = req.body; // I expect text to be a string but it is a JSON
});

我检查了请求标头,但缺少内容类型。即使“ Content-Type”是“ text /
plain”,它似乎也将解析为JSON。无论如何,有没有告诉中间件总是将正文解析为纯文本字符串而不是json?以前req具有req.rawBody此功能的早期版本可以解决此问题,但现在不再存在。在Express中强制将正文解析为纯文本/字符串的最简单方法是什么?


阅读 243

收藏
2020-07-07

共1个答案

一尘不染

如果删除bodyParser()中间件的使用,则应该为文本。您可以查看bodyParser文档以获取更多信息:http : //www.senchalabs.org/connect/middleware-
bodyParser.html

删除此行:

app.use(express.bodyParser());

编辑:

看起来你是对的。同时,您可以创建自己的rawBody中间件。但是,您仍然需要禁用bodyParser()。注意:req.body仍然会undefined

这是一个演示:

app.js

var express = require('express')
  , http = require('http')
  , path = require('path')
  , util = require('util');

var app = express();

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

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.use(rawBody);
  //app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
});

app.post('/test', function(req, res) {
  console.log(req.is('text/*'));
  console.log(req.is('json'));
  console.log('RB: ' + req.rawBody);
  console.log('B: ' + JSON.stringify(req.body));
  res.send('got it');
});

http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

test.js

var request = require('request');

request({
  method: 'POST',
  uri: 'http://localhost:3000/test',
  body: {'msg': 'secret'},
  json: true
}, function (error, response, body) {
  console.log('code: '+ response.statusCode);
  console.log(body);
})

希望这可以帮助。

2020-07-07