2016-08-17 53 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”变得不确定,范围会丢失 –