在express.js中,任何方式在一个函数中捕获对json和html的请求?

时间:2012-01-19 15:30:12

标签: node.js connect express

有没有人知道 express.js 中的一种方式来捕获html和json的单个函数中的请求?

基本上我想要/users/users.json的单一路线 - 就像铁路路线一样 - >控制器。

这样,我可以将逻辑封装在一个函数中,并决定渲染html或json。

类似的东西:

app.get('/users[.json]', function(req, res, next, json){
  if (json)
    res.send(JSON.stringfy(...));
  else
    res.render(...); //jade template
});

我可以使用一个参数吗?

3 个答案:

答案 0 :(得分:52)

我认为res.format()是在Express 3.x和4.x中执行此操作的方法:

res.format({
  text: function(){
    res.send('hey');
  },

  html: function(){
    res.send('<strong>hey</strong>');
  },

  json: function(){
    res.send({ message: 'hey' });
  }
});

这依赖于Accept标头,但是您可以使用自定义中间件或类似connect-acceptoverride之类的东西自行处理此标头。

自定义中间件的一个示例可能是:

app.use(function (req, res, next) {
  var format = req.param('format');

  if (format) {
    req.headers.accept = 'application/' + format;
  }

  next();
});

答案 1 :(得分:20)

一个路由很简单,一个字符串,在内部编译成一个RegExp,如手册所示,所以你可以这样做:

app.get("/users/:format?", function(req, res, next){
  if (req.params.format) { res.json(...); }
  else {
    res.render(...); //jade template
  }
});

点击此处查看更多信息:http://expressjs.com/guide.html#routing

答案 2 :(得分:1)

我对上述答案不满意。这就是我做的事情。如果有帮助,请投票。

我只是确保所有json请求都将Content-Type标头设置为&#39; application / json&#39;。

if (req.header('Content-Type') == 'application/json') {
  return res.json({ users: users });
} else {
  return res.render('users-index', { users: users });
}