2014-01-30 39 views
0

我使用sails.js,我想知道範圍變種和生命週期的var聲明爲一個帆控制器。範圍變量和生命週期到帆控制器nodejs

var user = {}; 

module.exports = { 
    index: function (req, res) { 
    user.connected = false; 

    return res.view({ 
     user: user 
    }); 
    }, 

    member: function (req, res) { 
    user.connected = true; 

    return res.view('home/index', { 
     user: user 
    }); 

    } 
}; 

在首先我想只有在member功能設置user,但一旦我參觀了/成員的網頁,用戶與user.connected=true初始化,當我參觀了/索引頁,它仍然連接。所以我將user.connected=false添加到index函數中,它的工作方式與預期相同。

但我完全不理解。據我所知,userHomeController.js腳本的局部變量,每次加載文件時應該銷燬它,並在每次調用時將其重置爲{}

其實,雖然我寫的問題,我想到的東西...

因爲我用的是module.exports,功能指標和成員被加載到內存和呼叫沒有在HomeController.js完成腳本,但在module.exports全局對象上,並且因爲user是一個對象,所以他被「指針」引用,它不是一個副本,而是每個函數內的引用,所以當我對它進行更改時,它在任何使用引用的地方都會更改。它就像一個模塊內的全局對象,很奇怪。

我對不對?我錯過了什麼?你有更高級的解釋嗎?謝謝。

回答

1

我對風帆並不熟悉,但是您在這裏遇到的問題是每個請求都會將用戶寫入該模塊變量,並且在處理併發請求時您會遇到各種各樣的混淆。在請求持續時間內保持變量的標準方法是將其附加到請求對象:

module.exports = { 
    index: function (req, res) { 
     if (!req.user) { 
      // You'll probably have resolved a user and appended it to req in an 
      // Earlier middleware. 
      req.user = {}; 
     } 

     user.connected = false; 

     res.view({ user: req.user }); 
    }, 

    member: function (req, res) { 
     if (!req.user) { 
      req.user = {}; 
     } 

     user.connected = true; 

     res.view('home/index', { user: req.user }); 
    } 
}; 
+0

何,是的,我知道,事實上,實際上這段代碼是臨時的,我寫到設計師有一些變數,而不必關心數據庫!創建視圖只是假數據,真正的數據會在後面出現。 這只是當我創建假數據時,我想知道用戶var的生命週期和範圍,因爲它沒有按照我的預期行事。 – Vadorequest