如果给定路由参数,则返回JSON

时间:2015-11-05 11:15:11

标签: javascript json node.js express

我正在使用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的标准操作?

2 个答案:

答案 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);
    }
});