有没有人知道 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
});
我可以使用一个参数吗?
答案 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 });
}