2017-04-20 11 views
1

私はノードプロジェクトを持っています。 ルートファイルがindex.jsで、ファイルがhelper.jsの場合、ここではヘルパー機能がいくつかあり、それをindex.jsにインポートしました。 helper.jsで関数を使用してデータを取得しようとしていますが、index.jsで呼び出すとundefinedが返されます。 しかし、helper.jsには、私が必要とするデータを示すconsole.logが表示されます。 この問題をどのように修正できますか?値を返すときは未定義です

index.jsファイルの内容:

const helper = require('./helper'); 

let data = helper.getData(); 
console.log(data); // undefined 

helper.jsファイルの内容:

const fs = require('fs'); 

module.exports = { 
    getData:() => { 
    fs.readFile('data.json', 'utf8', (err, data) => { 
     const allData = JSON.parse(data); 
     console.log(allData); // IS OK! 
     return allData; 
    }); 
    } 
} 
+1

非同期関数の素晴らしい世界へようこそ – George

+0

このトピックを見るhttp://stackoverflow.com/questions/20647346/simple-nodejs-callback-example-with-fs-readfile – Leguest

+0

約束を使ってオブジェクトを取得する – Tushar

答えて

5

あなたはPromiseを使用することができます。

const fs = require('fs'); 

module.exports = { 
    getData:() => { 
    return new Promise(function(resolve, reject){ 
     fs.readFile('data.json', 'utf8', (err, data) => { 
      if(err){ 
       reject(err); 
      } else { 
       try { 
        resolve(JSON.parse(data)); 
       } catch(ex){ 
        reject(ex); 
       } 
      } 
     }); 
    }); 
    } 
} 

、その後:

helper.getData().then(function(data){ 
    console.log(data); 
}, function(err){ 
    // here something failed 
}); 

fs.readFileメソッドは非同期であり、結果として任意のデータを与えることはありませんcheck the documentation here

だから一つの選択肢は、私が行ったようにPromiseを使用するか、@Tatsuyukiイシの答えで提案されているように、あなたがcallback実装についてのドキュメントを確認することができますcallbackを使用することです。

+4

コードを掲示してくれてありがとうございました – Aron

+0

私はあなたの答えの後で私のコメントを削除しました、約束を書くのは怠惰でした;) – Tushar

+0

私は誰も気にしたくありませんが、IMHOはかなり悪い答えです、それは解決策を示唆しているに過ぎないが、基本的な問題が何かを1つの言葉で説明するわけではない。そして、示されたソリューションは、より多くのプールからの任意のものです。なぜ私は約束を使用すべきですか?私はまた、コールバックで行くことができます。 –

2

fs.readFileは非同期関数なので、何も返されません。

返品に本当に必要な場合は、同期バージョンfs.readFileSyncを使用することができます。それ以外の場合は

- と、それを行うには良い方法は - つまり、あなたがallDataresolve、その後することができますpromiseを返すgetData持っているだろう。

1

readFileは、コールバックを受け付ける非同期関数です。 2つのオプションがあります:

1。 getData()のパラメータとしてコールバックを取得します。

getData: (callback) => { 
    fs.readFile('data.json', 'utf8', (err, data) => { 
     const allData = JSON.parse(data); 
     console.log(allData); // IS OK! 
     callback(allData); 
    }); 
    } 

2。同期バージョンを使用してください。もちろん

getData:() => { 
    var data = fs.readFileSync('data.json', 'utf8'); 
    const allData = JSON.parse(data); 
    console.log(allData); // IS OK! 
    return allData;   
    } 

、あなたは物事をチェーンでより美しいですが、それはしばしばBluebirdのような依存関係で使用されるの約束を使用することができます。

1

allDataは、getData関数ではなく、コールバック関数から返されます。 getDataに明示的なreturnがないので、helper.getData()関数はundefinedを返し、この値は必要なものの代わりに出力されます。

@ sandの答えのように、Promiseを使用してデータを正しく返すことをお勧めします。

関連する問題