2016-09-09 5 views
0

現在、Node.jsを使用していますが、この問題は解決していません。範囲外の変数にcsvtojsonコンバーターの値を渡す

私は他のJSファイルで何度も呼び出すことができる別のモジュールとしてcsvtojsonコンバータ(https://github.com/Keyang/node-csvtojson)を使用しています。ここで

は私tools.jsです:

module.exports = { 
 
\t csvToJson: function (csvPath) { 
 
\t \t var Converter = require('csvtojson').Converter; 
 
\t \t var converter = new Converter({}); 
 
\t \t var transfer = "DEFAULT"; 
 
\t \t converter.fromFile(csvPath, function(err, result){ 
 
\t \t \t if (err) { 
 
\t \t \t \t return console.log(err); 
 
\t \t \t } 
 
\t \t \t else { 
 
\t \t \t \t transfer = result; 
 
\t \t \t } 
 
\t \t }); 
 
\t \t return transfer; 
 
\t } 
 
};

そして、ここでは、私はそれを呼び出す方法です:

var countriesCsvFile = path.join(__dirname, '..', 'testDataFiles', 'countries.csv'); 
 

 
//GRAB TOOLS 
 
var tools = require('../app/tools'); 
 
console.log(tools.csvToJson(countriesCsvFile));

結果は常にコンバータがそれに触れていないことを示す "DEFAULT"値です。

私はそれを関数の戻り値として渡し、さらにファイルを作成せずにその場でデータを処理し、それを読み取ることができます。 確かにいくつかの範囲の問題ですが、私の頭皮を数時間掻き、質問をブラウジングした後、私は何か遠隔的に有用なものを取り出すことができませんでした。

また別の注記:私は、transfer = resultの代わりにconsole.log(result)を呼び出すと、私の貴重で望ましいデータが表示されます。

+2

非同期コーディングをご覧ください。基本的には、 'transfer'を返すとCSVファイルの読み込みが完了しません。 – Sirko

答えて

1

csvToJson関数は、値が割り当てられる前に 'transfer'を返すので、コールバック関数を渡す必要があります。 Sirkoが言ったように、それは非同期です。コールバックの代わりに約束を使用することもできますが、それ自体が別の話題です。

module.exports = { 
    csvToJson: function (csvPath, callback) { 
    var Converter = require('csvtojson').Converter; 
    var converter = new Converter({}); 
    converter.fromFile(csvPath, function(err, result){ 
     if (err) { 
     callback(err); 
     } 
     else { 
     callback(null, result); 
     } 
    }); 
    } 
};