无法使用Express 4路由器获取Content-Type标头

时间:2014-04-13 02:03:57

标签: node.js heroku express http-headers

我尝试根据请求中的Content-Type标头返回不同的内容:纯文本或JSON对象。在Express 3.x中,我使用req.accepted('application/json')来查明用户是否要求使用JSON。但是req.accepted()已在4.x中弃用。

我尝试req.is() - 返回undefinedreq.accepts() - 没用。最后,我采取了:

var router = require('express').Router();
router.get('/ping', function(req, res) {
    var serverTime = (new Date()).toLocaleString();
    if(req.get('Content-Type').indexOf('json') !== -1) {
        res.set({'Content-Type': 'application/json'});
        res.send({serverTime: serverTime});
    }
    else {
        res.send('serverTime: ' + serverTime);
    }
});

这在localhost上运行得很好(用CURL测试过),但是一旦我部署到Heroku,我就得到了:

    TypeError: Cannot call method 'indexOf' of undefined at 
    Object.router.get.res.set.Content-Type [as handle]

如何在Express 4中获取标题类型并正确处理? Heroku是否以某种方式剥夺了标题?或者它可能是那些新的中间件?

更新:我刚刚确认每次使用CURL都有效,使用浏览器会在本地和Heroku上为undefined生成req.get('Content-Type') - 所以这不是Heroku问题。不过,我需要标题。

1 个答案:

答案 0 :(得分:3)

Content-Type请求上检查GET没有意义。 Content-Type标头定义请求正文中的类型数据,GET请求没有正文。 req.is也会对此进行检查,因此在这种情况下它也无用。

您应该将Accept标头设置为application/json从客户端GET并在服务器上使用req.accepts('json')来验证客户端是否已指示其支持JSON。