我正在使用Express应用程序,并希望尝试获取类似于reddit的路由,因为附加.json
几乎任何URL都返回JSON而不是呈现的模板。
我使用Jade作为我的渲染引擎,通过Express中的app配置进行设置:
app.set('view engine', 'jade');
app.set('view options', {
layout: false
});
if (app.get('env') == 'prod') {
app.enable('view cache');
}
当我想渲染页面时,我使用res.render
:
res.render('sometemplatefile', {
title: 'This is my template',
data: users
})
我的路由被定义为标准,使用Passport.js中间件:
app.get('/someurl', passportConf.isAuthenticated, someController.getSomeURL);
我知道我可以像这样添加一个可选的路由参数:
app.get('/someurl(/:flag)', passportConf.isAuthenticated, someController.getSomeURL);
然后在每个路由控制器中都有if (req.params.flag === 'json') { return res.json(blah) }
非常难看。
是否可以通过中间件或类似工具绕过res.render
的标准操作?
答案 0 :(得分:0)
试试这个
app.use(function(req, res, next) {
res.handleResopnse = function(req, res, data, template, title) {
if (req.params.flag === 'json'){
return res.json(data);
}
else{
res.render(template, {
'title': title,
'data': data
});
}
}
}
在someController.getSomeURL
使用
res.handleResopnse(req,res,data,template,title);
答案 1 :(得分:0)
根据标志:
,您可以使用一个负责渲染数据的函数/*
* Helper function
*/
// Returns data to client, either in template or in JSON object
function sendData(req, res, data) {
if (req.params.flag === "json") {
return res.json(data);
} else {
return res.render('sometemplatefile', {
title: 'This is my template',
data: data.users
});
}
};
/*
* Routes
*/
// Description for someurl
app.get('/someurl', passportConf.isAuthenticated, function(req, res, next) {
// Get the data needed for this route
db.fetchData(x, function(data, err) {
sendData(req, res, data);
}
});