变量未在node.js中异步更新

时间:2016-08-17 22:18:33

标签: javascript node.js asynchronous

我是node.js的新手,我有一些代码无法正常工作。我认为问题出在异步函数中。这段代码非常简单。读取一些xml,将值赋给变量,将这些变量分配为用于连接到另一个node.js文件中的数据库的属性。问题是读取xml后变量没有更新。

这是代码,

//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之后添加.then()保证但后来我的另一个文件说“dev”未定义。

2 个答案:

答案 0 :(得分:1)

加载配置文件可能是阻止节点(IMHO)中的文件I / O的最佳用例。只需使用fs.readFileSync()代替。

否则,如果您必须保持异步文件读取(我怀疑是这种情况,当您尝试加载配置值以进行启动时),请不要尝试直接导出值。相反,导出一个函数,它将这些值提供给回调或promise,然后使用该函数。如果您需要在多个位置使用这些配置值并且您希望确保该文件只读取一次,则可以添加某种缓存机制。

说实话(而且我不确定这是否适合您),最简单的解决方案是完全放弃配置文件的想法,然后提供您正在寻找的配置(用户,服务器) ,密码等)与环境变量,然后从process.env

读取它们

答案 1 :(得分: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       
                }
            };
    })
});