webentwicklung-frage-antwort-db.com.de

lesen der Datei mit ES6-Versprechen

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?

6
2619

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);
    });
  });
}
19
hackerrdave

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))
12
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));
7
adrice727

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.

5
Elias Goss

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)
})()
1
mikemaccana