web-dev-qa-db-ja.com

ES6 promiseでファイルを読み取る

let arr = [];

function getData(fileName, type) {
    return fs.readFile(fileName,'utf8', (err, data) => {
        if (err) throw err;

        return new Promise(function(resolve, reject) {
            for (let i = 0; i < data.length; i++) {
                arr.Push(data[i]);
            }

            resolve();
        });
    });
}

getData('./file.txt', 'sample').then((data) => {
    console.log(data);
});

上記のコードを使用し、nodejsを使用してコマンドラインで実行すると、次のエラーが発生します。

getData('./file.txt', 'sample').then((data) => {
                               ^

TypeError: Cannot read property 'then' of undefined

どうすれば解決できますか?

10
2619

fs.readFile呼び出し全体を新しいPromise内にラップし、コールバックの結果に応じてプロミスを拒否または解決します。

function getData(fileName, type) {
  return new Promise(function(resolve, reject){
    fs.readFile(fileName, type, (err, data) => {
        err ? reject(err) : resolve(data);
    });
  });
}
22
hackerrdave

util.promisifyについて誰も話していないので、私は投稿しますが、質問は古くなります。なぜこのメッセージが表示されるのですか?

getData('./file.txt', 'sample').then((data) => {
                               ^

TypeError: Cannot read property 'then' of undefined

getDatafs.readFileファイルのラッパーです。 fs.readfileはthenableではありません(then関数を実装しません)。他のパターンであるコールバックパターンに基づいて構築されます。最もよく知られているthenableはPromisesであり、readFileから得たいものです。ちょっとした注意: Mozilla-Promises

あなたができることは、@ hackerrdaveのように自分で実装するか、promisifyを使用することをお勧めします:この関数は、コールバックベースの関数を約束されたものに変換するために実装されたNode.jsの組み込み関数ですベース。ここにあります: til.promisfyのNode.jsドキュメント

基本的に@hackerrdaveと同じですが、より堅牢で組み込みのノードutilです。

使用方法は次のとおりです。

const util = require('util');
const fs = require('fs');

const readFile = util.promisify(fs.readFile)
readFile("path/to/myfile").then(file => console.log(file))
16
Théophile Pace
const getData = (fileName, type) =>
  new Promise((resolve, reject) =>
    fs.readFile(fileName, type, (err, data) => {
      //if has error reject, otherwise resolve
      return err ? reject(err) : resolve(data);
    })
  );

getData('./file.txt', 'utf8')
  .then(data => console.log('Data: ', data))
  .catch(error => console.log('Error: ', error));
8
adrice727

これは、ノード10.2.0以降のワンライナーです。

(async () => console.log(String(await require('fs').promises.readFile('./file.txt'))))();

はい、すぐに使用できます。

8
Elias Goss

現在のノードの更新ノード10.0.0では、 fs.promises

const fs = require('fs')

(async function(){
    var fileContents = await fs.promises.readFile(FILENAME)
    var data = JSON.parse(fileContents)
})()
3
mikemaccana