2015-11-05 38 views
-1

我正在使用Express應用程序,並且想要嘗試獲取類似於reddit的路線,在那個附加.json幾乎任何URL都會返回JSON而不是呈現的模板。如果給定路由參數返回JSON

我用玉石作爲我的渲染引擎,通過我的應用程序配置在快速設定:

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); 

我知道我可以只需添加一個可選路線PARAM這樣的:

app.get('/someurl(/:flag)', passportConf.isAuthenticated, someController.getSomeURL); 

但隨後有if (req.params.flag === 'json') { return res.json(blah) }每個路由控制器裏面實在是太醜了。

是否有可能繞過中間件或類似的標準動作res.render

回答

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