我尝试根据请求中的Content-Type
标头返回不同的内容:纯文本或JSON对象。在Express 3.x中,我使用req.accepted('application/json')
来查明用户是否要求使用JSON。但是req.accepted()
已在4.x中弃用。
我尝试req.is()
- 返回undefined
和req.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问题。不过,我需要标题。
答案 0 :(得分:3)
在Content-Type
请求上检查GET
没有意义。 Content-Type
标头定义请求正文中的类型数据,GET
请求没有正文。 req.is
也会对此进行检查,因此在这种情况下它也无用。
您应该将Accept
标头设置为application/json
从客户端GET
并在服务器上使用req.accepts('json')
来验证客户端是否已指示其支持JSON。