2016-08-17 22 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の後.then()約束を追加しようとしたが、その後、私の他のファイルは、「DEV」は未定義であると言っています。あなたは自分のコールバックに新たに割り当てられた変数にアクセスしてコードを移動する必要が

+0

エラーのために 'err'変数をチェックしてみましたか? – Derek

+1

ファイルを読み込むまでに、すでにオブジェクトをエクスポートしています。すべての非同期コードを約束事に入れて適切に連鎖すれば、そのすべての終わりに、輸出などをしたいところです。そして、最終的なコールバックだけでも約束は必要ありません。 –

答えて

1

ロードの設定ファイルは、おそらくファイルをブロックするための最良のユースケースのノードでI/O(私見)です。代わりにfs.readFileSync()を使用してください。

にする必要があります。非同期ファイルの読み取りを続行する必要があります(スタートアップの設定値を読み込もうとしていると思われます)。直接値をエクスポートしないでください。代わりに、これらの値をコールバックまたは約束のいずれかに提供する関数をエクスポートし、代わりにその関数を使用します。これらの設定値が複数の場所に必要で、ファイルが一度だけ読み込まれるようにしたい場合は、ある種のキャッシュメカニズムを追加することができます。

真実を伝える必要があります(これがオプションであるかどうかはわかりません)。最も簡単な解決策は、構成ファイルのアイデアを完全に取り除き、探している構成(ユーザー、サーバー、パスワードなど)を環境変数で置き換えてから、process.envから読み取ります。

+1

That(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"が未定義になりスコープが失われているため、これは機能しません –

関連する問題