2014-06-22 41 views
0

我有2個不同的節點腳本... save_info.jssse_server.js導入openConections array。並且,sse_server.jssave_info.js進口function broadcast。 但是,這導致openConnections arraysave_info.jsundefined。爲什麼是這個,我該如何解決這個問題?節點require()問題需要對方的兩個腳本

save_info.js:

var openConnections = require('../scripts/sse_server.js').openConnections; 

function broadcast(result, event, httpObject) { 
    var result = JSON.stringify(result); 
    var date = new Date().getMilliseconds(); 
    httpObject.write('id: ' + date + '\n'); 
    httpObject.write('data: { \"' + event + '\":\n'); 
    httpObject.write('data:' + result + '\n'); 
    httpObject.write('data: }' + '\n\n'); 
} 

function db_finish(err, product, numberAffected, 
        result, event) { 
    if (err) { console.log(err) } 
    else { 
     console.log("Db insert successfull"); 
     openConnections.forEach(function(httpObject) { 
      broadcast(result, event, httpObject); 
     }); 
    } 
    console.log("Numer effected " + numberAffected); 
} 
module.exports.openConnections = openConnections; 

sse_server.js:

var broadcast = require("../data/save_info").broadcast; 

var openConnections = []; 

    for (var model in models){ 
     models[model].find({}).sort({_id: -1}).limit(1).exec(
      function (err, result){ 
       broadcast(result, model, res); 
      }); 
    } 
module.exports.broadcast = broadcast; 
+1

運行要求在這些文件上相互會使它們每執行兩次。這意味着加載b和b加載a,然後使用...但a沒有定義b,因爲正在使用的實例不是第一個。 – Catalyst

+0

相關問題,解釋語言中處理循環依賴的典型方法是什麼?我能想到的最好的方式是一個C樣式的「標題」,其中「原型」在解析後的某個時刻會「鏈接」。像懶惰的要求。 –

回答

1

爲了防止循環依賴,模塊的NodeJS裝載機停止加載在save_info.js這就是爲什麼openConnections是不確定的sse_server模塊。要解決此問題,請執行以下操作:

1)將broadcast()移出到單獨的模塊中(例如broadcast.js)。

2)把需要在兩個sse_server.js和save_info.js

3)( '../數據/ broadcast.js ')在sse_server刪除要求(' ../數據/ save_info')。 js

+0

我希望有一個工作,而不是這個......但夠好。我認爲節點以某種方式處理了循環依賴,所以它們不會發生。 – dman

+0

模塊加載器停止加載以防止循環依賴,所以我們可以做的不過是爲了防止它。我想這是周圍的工作。我希望節點給出一些警告,說明存在一個循環依賴關係,並說它沒有加載模塊,以便我們不必通過調試器並試圖弄清楚爲什麼我們的代碼不工作。 – Ben