6

bodyParser如果快递没有触发,我如何才能访问请求中的 POST 数据?

var server = express();
server.use(express.bodyParser());
server.post('/api/v1', function(req, resp) {
  var body = req.body;
  //if request header does not contain 'Content-Type: application/json'
  //express bodyParser does not parse the body body is undefined
  var out = {
    'echo': body
  };
  resp.contentType('application/json');
  resp.send(200, JSON.stringify(out));
});

注意:在 ExpressJs 3.x+req.body中不是自动可用的,需要bodyParser激活。

如果未设置内容类型标头,是否可以指定默认内容类型application/json并触发bodyParser

否则是否可以在此快速 POST 函数中使用裸 nodejs 方式访问 POST 数据?

(例如req.on('data', function...

4

3 回答 3

20

你有很多选择,包括自己手动调用 express(连接,真的)中间件函数(真的,去阅读源代码。它们只是函数,没有什么深奥的魔法可以让你感到困惑)。所以:

function defaultContentTypeMiddleware (req, res, next) {
  req.headers['content-type'] = req.headers['content-type'] || 'application/json';
  next();
}

app.use(defaultContentTypeMiddleware);
app.use(express.bodyParser());
于 2013-06-21T05:53:24.380 回答
3

在 bodyParser 启动之前,我使用了这个中间件,这可能会有所帮助。它查看请求流的第一个字节,并进行猜测。这个特定的应用程序只真正处理 XML 或 JSON 文本流。

app.use((req,res, next)=>{
    if (!/^POST|PUT$/.test(req.method) || req.headers['content-type']){
        return next();
    }
    if ((!req.headers['content-length'] || req.headers['content-length'] === '0') 
            && !req.headers['transfer-encoding']){
        return next();
    }
    req.on('readable', ()=>{
        //pull one byte off the request stream
        var ck = req.read(1);
        var s = ck.toString('ascii');
        //check it
        if (s === '{' || s==='['){req.headers['content-type'] = 'application/json';}
        if (s === '<'){req.headers['content-type'] = 'application/xml'; }
        //put it back at the start of the request stream for subsequent parse
        req.unshift(ck);
        next();
    });
});
于 2016-02-02T11:52:46.770 回答
1

在 Express 4.x 中,有同样的问题,客户端行为不端并且没有发送内容类型。将一些配置传递给 express.json() 就可以了:

app.use(express.json({inflate: true, strict: false, type: () => { return true; } }));
于 2021-11-26T20:31:50.887 回答