2013-02-20 46 views
0

我從頭開始在Node.js中構建一個Web服務器(不明確,沒有貓鼬)。我的代碼(大大簡化)看起來是這樣的:用於處理Node.js中的變量作用域的方法

var app = {}; 

app.config = require('./config'); 
app.http = require('http'); 
app.router = require('./router'); 
app.mongoDb = require('mongodb'); 
app.mongoClient = app.mongoDb.MongoClient; 
app.mongoClient.connect(
     'mongodb://' 
     + app.config.db.server + ':' 
     + app.config.db.port + '/' 
     + app.config.db.catalog, function(err, db) { 
if (!err) { 
     app.db = db; 
     app.httpServer = app.http.createServer(); 
     app.httpServer.on('request', function(req, response) { 
      req.app = app; 
      req.response = response; 
      req.value = {}; 
      app.router.main(req); 
     }); 
     app.httpServer.listen(app.config.port); 
    } 
}); 

基本上我定義的一切,一個叫app變量中,是全球性的。我連接數據庫並創建一個http服務器,然後我將app放入事件處理程序的請求對象(req)中。我還將響應對象(response)和空值對象(value)置於req之下。所以現在,如果我用app.router.main(req)調用路由器功能,我只需要將req傳遞給它,我仍然可以訪問所有全局內容以及與請求相關的請求,響應和任何其他值。它似乎工作正常。

我對這個做法的問題是:

  1. 有沒有讓我所有的對象時,我需要他們的一個更簡單的方法?
  2. req對象的通過是否會對性能產生顯着的不利影響?
  3. 這可能會導致與數據庫連接,請求,響應或我的應用程序的任何其他部分有關的不可預見的問題?
+0

更簡單的方法是隻使用了一個框架。否則,整個模塊的構造函數/初始值設定項。或者只是把東西放在一個文件中,因爲模塊對於這類事情並不是很好。 – Ryan 2013-02-20 15:44:26

回答

1
  1. 有沒有讓我所有的對象時,我需要他們的一個更簡單的方法?

    捆綁一切下一個對象似乎不是最好的設計選擇給我。當然,我可以接受reqres幾乎是總是連在一起,所以肯定隨便放req.res = res,但是app

    此外你的app不應該真的改變;所以你應該不需要不斷繞過;一旦應該就夠了。

    我會考慮添加一個導出,接受app上下文到您的程序需要它們的模塊。

    var app; 
    
    module.exports = { 
        init: function (_app) { 
         app = _app; 
        }, 
    
        something: function (req) { 
         // use req, you've got app if you need it. 
        } 
    } 
    
  2. 請問REQ物體的通過處處有服務表現一個顯著的不利影響?

    不,沒什麼嚴重的。您只傳遞對象的引用,而不是對象本身。如果您在持久對象(例如app)上跟蹤所有reqs,則會出現JavaScript相當於內存泄漏的情況,但這不適用於此。

  3. 這可能會導致與數據庫連接,請求,響應或我的應用程序的任何其他部分無法預料的問題?

    不是我能想到的。

    如果你是不斷不得不傳遞上下文對象,我會仔細檢查你是否沒有可憐的模塊結構,或者是過度模塊化你的代碼。


FWIW,即使你不使用明示或連接,有什麼不對看着自己的代碼庫,看到如何他們解決了這個問題;他們都是開源的(https://github.com/visionmedia/express,https://github.com/senchalabs/connect

0

更簡單的方法是隻使用框架。否則,整個模塊的構造函數/初始值設定項。或者只是把東西放在一個文件中,因爲模塊對於這類事情並不是很好。

整個模塊的一個初始化的一個例子,順便說一句,應該是:

app.router = require('./router').create(app); 
var app; 

module.exports.create = function(_app) { 
    app = _app; 
    return module.exports; 
}; 

不,通過它周圍不會對性能產生任何明顯的影響,相比到其他任何東西。

0

嗯我幾乎永遠只是某種singelton的,我可以要求每當我需要它可以讓說你有:

app.js

module.exports = exports = { 
    start: function(config) { 
     this.database = new database(config.database); 
     this.webserver= http.createServer(); 
    } 
} 

現在你到了設置你的路由說,也許如果你需要你的數據庫對象,他們每個人都有自己的文件,例如你可以簡單的做。

var db = require('app.js').database; 

恕我直言,這工作得很好,並允許您訪問重要的東西。無論您需要它:)