2011-11-30 50 views
3

我在node.js中有非常奇怪的require()行爲。Node.js中require()的多次使用返回未定義的結果

我有簡單的common.js:

module.exports = common = { 
    config: require('./config/config'), 
    errorCodes: require('./config/errorCodes'), 
    server: require('./server/server').server, 
    dbManager: require('./db/dbManager').dbManager, 
    idGenerator: require('./utils/idGenerator').idGenerator 
}; 

我server.js:

var http = require('http'), 
    url = require("url"), 
    common = require('../common'); 

var server = (function() 
{ 
    var server = http.createServer(function (request, response) 
    { 

    }); 

    // running server 
    function startServer() 
    { 
     server.listen(common.config.port); 
     console.log('Tracking server running at :' + common.config.port); 
    } 

    return { 
     startServer: startServer 
    }; 
})(); 

module.exports.server = server; 

所以,案例1, - 我只在server.js reqiuring普遍,它的工作原理:

start.js:

//var common = require('./common'); 
var server = require('./server/server').server; 

// initialize whole server 
var init = function() 
{ 
// common.dbManager.init(); 
    server.startServer(); 
}; 

init(); 

而且,第2種情況,我需要在這兩個模塊共同的 - 不工作:

start.js

var common = require('./common'); 
var server = require('./server/server').server; 

// initialize whole server 
var init = function() 
{ 
    common.dbManager.init(); 
    server.startServer(); 
}; 

init(); 

的錯誤是,在第二種情況下一定性的判定常見。 config和common.dbManager未定義。有人知道爲什麼嗎?

在此先感謝。

更新

謝謝你們,下面的解決方案工作:不需要

你的 '普通' 的模式:只需要的模塊,你需要 明確

回答

8

你有一個週期:server - >common - >server。 Node.js require()返回undefined(按設計)在循環中再次需要加載模塊時。

解決你的週期。

+1

如果你不能沒有這個循環,至少要移動process.nextTick()中的實際代碼(比如'init'),或者甚至更好,你可以在一個地方手動調用初始化。你的'普通'模型是不需要的:只需要明確需要的模塊。他們被緩存,所以沒有性能損失。 – 2011-11-30 15:54:16

+0

我相信你是對的。我會明天檢查一下,讓你們知道結果。 –