如何根据接受标头重新定向路由或发回JSON?

时间:2013-07-23 19:55:54

标签: javascript node.js express

如果用户访问路由并且接受标头仅允许JSON,我想要发回JSON,并且如果用户访问路由并且接受标头不允许JSON,我想将用户重定向到页面。

我的解决方案非常hacky,但它涉及检查req.headers.accept并查看字符串是否包含json。如果是,我返回JSON,否则,我重定向。有更优化的解决方案吗?

2 个答案:

答案 0 :(得分:3)

您可以尝试res.format方法。

res.format({
  'application/json': function(){
    res.send({ message: 'hey' });
  },

  default: function(){
    res.redirect('nojson.html');
  }
});

答案 1 :(得分:0)

cr0描述的方法可能是“正确的方法”。我不知道这个更新的辅助方法。

这个解决方案是正确的。您可以使用req.get以不区分大小写的方式获取标头,并使用regexp检查值。通常我会使用以下内容。

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"));