2017-02-12 111 views
0

我有一個node.js + Express應用程序。我正在使用Passport進行用戶登錄。我的數據庫中有一個系統設置表,我想在用戶成功登錄後讀取它,然後從它創建app.locals.setting_name局部變量,這些變量將在應用程序的生命週期中使用。Node.js Express應用程序只在登錄時插入app.local.setting一次

設置表具有名稱和值列,表示設置名稱及其對應的值。例如:Name - SUPPORT_EMAIL和Value - [email protected]作爲示例。

所以我會app.locals.SUPPORT_EMAIL值設置爲[email protected]

這裏是我的代碼至今:

app.js

var settingsObj = require('./config/appSettings.js'); 
app.use(function(req, res, next) { 
    ... 
    ... 
    settingsObj.getApplicationSystemSetting(req.user, app); 
    next(); 
}); 

appSettings.js

exports.getApplicationSystemSetting = function() { 
    connectionPool.getConnection(function(err, connection){ 
     connection.query('select Name, Value from SystemSettings', function(err, rows){ 
      if(err) { 
       winston.log('info', '--------------------- ERROR: ' + err); 
       return; 
      } 

      console.log('-------------- settings: ' + JSON.stringify(rows)); 
      for(var i = 0; i < rows.length; i++) { 
       var setting = rows[i]; 
       app.locals.setting.Name = setting.Value; 
      } 
     }); 
    }); 
} 

然而,有兩個問題,我面對:

1)app.use調用設置代碼,我每次去到一個新的頁面時。我只想在用戶登錄時僅調用一次此代碼。

2)未設置app.locals。如果我做一個調試app.locals.SUPPORT_EMAIL爲未定義。

有關如何改進的建議或想法?

回答

0

所以,兩件事。實際上,app.use會在每次請求時發生。處理您的需求的最簡單方法是簡單地讓中間件檢查app.user,如果不存在,則調用next()而不做其他任何事情。所以調用中間件,但不會嘗試設置當地人。

二的問題,你的功能,設置app.locals實際上並沒有使用你所傳遞的參數(注意你的第二個代碼塊中的函數簽名),是異步,所以有一個很好的機會中間件在執行之前調用next()。函數簽名改爲:

功能(用戶,當地人,回調)

,然後讓中間件通「下一步」作爲回調。你傳遞的本地對象實際上應該是res.locals,因爲你只想設置該響應的變量,而不是整個應用程序。

+0

感謝您的解決方案。我實際上要使用app.locals.SETTING_NAME,因爲這些設置將在應用程序的生命週期中使用。我想問的另一件事是,我們可以做的app.locals數量是否有限制?導致我嘗試在本地存儲的某些行未定義。即使我將它們硬編碼爲app.locals.mysetting ='hello'並稍後console.log(app.locals.mysetting);它來自未定義。任何想法? – codeinprogress

相關問題