簡體   English   中英

如何將app.js中的公共變量渲染到express中的所有路徑

[英]how to render common variables from app.js to all routes in express

在我的Node.js應用程序中,一些渲染變量或每個路徑都是常見的。每個路徑上有大約4-5個變量。 我有大約20條路線。

目前我正在res.render中的每個路由傳遞這些變量

有沒有一種方法可以在某些地方傳遞這些公共變量'(例如:app.js)`,每個路由都在使用它,這樣我就可以清理一下我的代碼了。

我使用express.js作為模板的節點和handlebars

編輯:我想我應該多解釋一下

res.render('abc', {
                        commonitem1: 'one',
                        commonitem2: 'two',
                        ...
                   });

-------------------------------------
another route
res.render('xyz', {
                        commonitem1: 'one',
                        commonitem2: 'two',
                        ...
                   });

我希望避免在我的每條路線中重復這種情況,並希望從一個普通的地方渲染它。

對於會話或請求相關值,您可以將這些公共值存儲在全局變量中,然后直接在res.render中使用它們。 為此,您有以下選項

  • 使用app.use存儲值:

在你的app.js中添加一個中間件,為你做這件事。 請記住在您定義的任何其他路由之前編寫此中間件,因為中間件函數是按順序執行的。

app.use(function(req, res, next){
    res.locals.items = "Value";
    next();
});
//your routes follow
app.use(‘/’, home);

在您的路線中,您可以將items直接放在res.render中,例如:

res.render('layout', {title: 'My awesome title',view: 'home', item :res.locals.items });
  • 使用express-session存儲值:

如果你安裝了快速會話,你可以在req.session.item保存一些數據並將它們放在任何路由中,如:

res.render('layout', {title: 'My awesome title',view: 'home', item :req.session.items });

似乎res.locals是您正在尋找的 - 這個對象被傳遞給您的每個請求的視圖,並且作用於每個單獨的請求(即每個請求可以有自己的res.locals版本)。 還有app.locals ,它為所有請求共享。

我沒有這方面的實際經驗,但您可以使用此對象將所有變量傳遞給您的視圖,或者Express可以將app.locals任何app.localsres.locals合並以及您通過res.render()發送到視圖的res.render() 請仔細測試,我沒有在官方文檔中找到有關合並行為的相關信息。

至於填充res.locals ,為了保持代碼DRY ,您可以編寫一個自定義中間件 ,在您執行實際路由邏輯之前,使用您需要的任何內容來填充對象。

// I created common func for all routes as below.

function commonRes(layout, req, res) {

  if (req.session.user) {
    res.render(layout, {
      user: req.session.user
      //csrfToken: req.csrfToken() // csrf 
    })

  } else {
    res.render(layout, {
      user: null,
      csrfToken: null
    })
  }

  return res.end()
}



// and apply it to all routes simply as below



app.get('/', (req, res) => {

  return commonRes('index.html', req, res)

})

app.get('/new', (req, res) => {

  return commonRes('new.html', req, res)
})

您可以使用以下代碼創建一個constants.js文件

(function (constants) {
    var FetchDataErrorMessage = "Error while fetching User Data";
    var ConnectionErroMessage = "Error while fetching Connecting Server";
    var InsertDataErrorMessage = "Error while inserting User Data";
    var RemoveDataErrorMessage = "Error while removing User Data";
    var UpdateDataErrorMessage = "Error while updating User Data";
})(module.exports);

在您需要使用這些變量的任何文件中,您可以添加以下代碼。

var constants = require('constants');    
console.write(constants.RemoveDataErrorMessage);   

輸出: - “刪除用戶數據時出錯”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM