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
どうすれば解決できますか?
fs.readFile
呼び出し全体を新しいPromise
内にラップし、コールバックの結果に応じてプロミスを拒否または解決します。
function getData(fileName, type) {
return new Promise(function(resolve, reject){
fs.readFile(fileName, type, (err, data) => {
err ? reject(err) : resolve(data);
});
});
}
util.promisify
について誰も話していないので、私は投稿しますが、質問は古くなります。なぜこのメッセージが表示されるのですか?
getData('./file.txt', 'sample').then((data) => {
^
TypeError: Cannot read property 'then' of undefined
getData
はfs.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))
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));
これは、ノード10.2.0以降のワンライナーです。
(async () => console.log(String(await require('fs').promises.readFile('./file.txt'))))();
はい、すぐに使用できます。
現在のノードの更新ノード10.0.0では、 fs.promises
:
const fs = require('fs')
(async function(){
var fileContents = await fs.promises.readFile(FILENAME)
var data = JSON.parse(fileContents)
})()