如果用户访问路由并且接受标头仅允许 JSON,我想发回 JSON,并且如果用户访问路由并且接受标头不允许 JSON,我想将用户重定向到页面。
我的解决方案非常 hacky,但它涉及检查 req.headers.accept 并查看字符串是否包含 json。如果是,我返回 JSON,否则,我重定向。有没有更优化的解决方案?
如果用户访问路由并且接受标头仅允许 JSON,我想发回 JSON,并且如果用户访问路由并且接受标头不允许 JSON,我想将用户重定向到页面。
我的解决方案非常 hacky,但它涉及检查 req.headers.accept 并查看字符串是否包含 json。如果是,我返回 JSON,否则,我重定向。有没有更优化的解决方案?
你可以试试这个res.format
方法。
res.format({
'application/json': function(){
res.send({ message: 'hey' });
},
default: function(){
res.redirect('nojson.html');
}
});
cr0 描述的方法可能是“正确的方法”。我不知道这种较新的辅助方法。
该解决方案是正确的。您可以使用req.get
不区分大小写的方式获取标题,并使用正则表达式检查值。通常我使用以下内容。
module.exports = function() {
function(req, res, next) {
if(req.get("accept").match(/application\/json/) === null) {
return res.redirect(406, "/other/location");
};
next();
}
}
然后这可以用作中间件。
app.use(require("./jsonCheck")());
您还可以通过更改导出的函数来更详细地使用模块并重定向到自定义位置。
module.exports = function(location) {
function(req, res, next) {
if(req.get("accept").match(/application\/json/) === null) {
return res.redirect(406, location);
};
next();
}
}
并像这样使用它
app.use(require("./jsonRedirect")("/some.html"));