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

jus*_*ses 24 connect node.js express

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

基本上我想两个单一路线/users/users.json-像Rails会与它的路线- >控制器.

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

就像是:

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

我可以使用一个参数吗?

Bea*_*eau 53

我相信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' });
  }
});
Run Code Online (Sandbox Code Playgroud)

这依赖于Accept标头,但是您可以使用自定义中间件或类似connect-acceptoverride来自己处理此标头.

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

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

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

  next();
});
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案.由客户端来询问正确的标题,而不是服务器来解决它. (2认同)

ale*_*lex 20

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

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

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

  • 啊对 - 在快递指南中找到了答案.app.get('/ users.:format?',function(req,res){if(req.params.format =='json')res.send(JSON.stringify(...)); else res. render(...); // jade template}); (5认同)