2016-08-17 49 views
0

我是新來的node.js,我有一些代碼無法正常工作。我認爲這個問題是在異步功能。這段代碼非常簡單。讀取一些xml,將值分配給變量,將這些變量分配爲用於連接另一個node.js文件中的數據庫的屬性。問題是讀取xml後變量不會更新。變量不會在node.js中異步更新

下面的代碼,

//set some variables 
userXML = "bgdf"; 
passwordXML = ""; 
serverXML = ""; 
databaseXML = ""; 

//parse the xml 
var fs = require('fs'), 
xml2js = require('xml2js'); 
var parser = new xml2js.Parser({explicitArray : false}); 
fs.readFile(__dirname + '/variables.xml', function(err, data) { 
parser.parseString(data, function (err, result) { 
    userXML = result.variables.user; 
    passwordXML = result.variables.password; 
    serverXML = result.variables.server; 
    databaseXML = result.variables.database; 

    //What's in this variables? The right values! 
    console.log(userXML); 
    console.log(passwordXML); 
    console.log(serverXML); 
    console.log(databaseXML); 

}) 
}); 

    exports.dev = { 
      db: { 
      //What's in these variables? The wrong values! Values from top of file - never updated 
       user: userXML, 
       password: passwordXML, 
       server: "myservername.net", 
       database: databaseXML  
      } 
     }; 

我嘗試添加了READFILE後。那麼()承諾,但後來我的其他文件說,「開發」是不確定的。

+0

你有沒有試過檢查錯誤的'err'變量? – Derek

+1

當你加載你的文件時,你已經導出了你的對象。如果你把所有的異步代碼放在承諾中並正確地鏈接它們,那麼所有這些都是你想要做出口的地方,等等。你甚至不需要承諾 - 只是最終的回調。 –

回答

1

加載配置文件可能是最好的用例阻止文件的I/O節點(恕我直言) 。改爲使用fs.readFileSync()

否則,如果你必須保持異步文件讀取(我懷疑是這種情況,當你試圖加載你的啓動配置值),不要嘗試直接導出值。相反,導出一個函數將提供這些值爲回調或承諾,然後使用該函數。如果您在多個位置需要這些配置值,並且您想確保該文件只讀取一次,則可以添加某種緩存機制。

真相被告知(我不確定這是否是您的選擇),最簡單的解決方案將完全拋棄配置文件的想法,然後提供您正在尋找的配置(用戶,服務器,密碼等)與環境變量,然後從process.env讀取它們。

+1

(readFileSync)工作謝謝!我同意,有更好的方法來做到這一點,但我沒有選擇重新配置。也許有一天 –

0

你只需要移動你的代碼訪問的新分配變量到你的回調:

//set some variables 
userXML = "bgdf"; 
passwordXML = ""; 
serverXML = ""; 
databaseXML = ""; 

//parse the xml 
var fs = require('fs'), 
xml2js = require('xml2js'); 
var parser = new xml2js.Parser({explicitArray : false}); 
fs.readFile(__dirname + '/variables.xml', function(err, data) { 
    parser.parseString(data, function (err, result) { 
      userXML = result.variables.user; 
      passwordXML = result.variables.password; 
      serverXML = result.variables.server; 
      databaseXML = result.variables.database; 

      //What's in this variables? The right values! 
      console.log(userXML); 
      console.log(passwordXML); 
      console.log(serverXML); 
      console.log(databaseXML); 
      exports.dev = { 
       db: { 
        //What's in these variables? The wrong values! Values from top of file - never updated 
        user: userXML, 
        password: passwordXML, 
        server: "myservername.net", 
        database: databaseXML  
       } 
      }; 
    }) 
}); 
+0

這不起作用,因爲「db」變得不確定,範圍會丟失 –