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);
});
Wenn ich obigen Code verwende und ihn in der Befehlszeile mit nodejs ausführe, erhalte ich folgenden Fehler.
getData('./file.txt', 'sample').then((data) => {
^
TypeError: Cannot read property 'then' of undefined
Wie kann ich das lösen?
Sie möchten den gesamten fs.readFile
-Aufruf in eine neue Promise
einschließen und das Versprechen je nach Rückrufergebnis ablehnen oder auflösen:
function getData(fileName, type) {
return new Promise(function(resolve, reject){
fs.readFile(fileName, type, (err, data) => {
err ? reject(err) : resolve(data);
});
});
}
Niemand hat über util.promisify berichtet, also werde ich posten, egal wie alt die Frage ist ... Warum haben Sie diese Nachricht?
getData('./file.txt', 'sample').then((data) => {
^
TypeError: Cannot read property 'then' of undefined
getData ist ein Wrapper für die Datei "fs.readFile". fs.readfile ist keine thenable: es implementiert keine then-Funktion. Es basiert auf dem anderen Muster, dem Rückrufmuster. Am bekanntesten sind dann Versprechungen, und das ist es, was Sie von readFile erwarten, glaube ich. Kleine Erinnerung: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
Was Sie also tun können, ist entweder die Implementierung selbst wie bei @ hackerrdave oder ich würde empfehlen, promisify zu verwenden: Diese Funktion ist eine eingebaute Funktion von Node.js, die implementiert wurde, um Callback-basierte Funktionen in versprochene Funktionen zu transformieren. Sie finden es hier: https://nodejs.org/api/util.html#util_util_promisify_original
Es macht im Grunde dasselbe wie @ hackerrdave, aber es ist robuster und der eingebaute Knoten util.
So verwenden Sie es:
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));
Hier ist ein Einzeiler ab Knoten 10.2.0:
(async () => console.log(String(await require('fs').promises.readFile('./file.txt'))))();
Ja, jetzt ist es out of the box.
Update für aktuellen Knoten Ab Knoten 10.0.0 können Sie jetzt fs.promises
verwenden:
const fs = require('fs')
(async function(){
var fileContents = await fs.promises.readFile(FILENAME)
var data = JSON.parse(fileContents)
})()