364 Stimmen

Daten von fs.readFile abrufen

var content;
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
});
console.log(content);

Protokolle undefined warum?

398voto

Matt Esch Punkte 22161

Um zu erläutern, was @Raynos gesagt hat, ist die von Ihnen definierte Funktion ein asynchroner Rückruf. Sie wird nicht sofort ausgeführt, sondern erst, wenn das Laden der Datei abgeschlossen ist. Wenn Sie readFile aufrufen, wird die Kontrolle sofort zurückgegeben und die nächste Codezeile wird ausgeführt. Wenn Sie also console.log aufrufen, wurde Ihr Callback noch nicht aufgerufen, und der Inhalt wurde noch nicht gesetzt. Willkommen bei der asynchronen Programmierung.

Beispielhafte Ansätze

const fs = require('fs');
// First I want to read the file
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    const content = data;

    // Invoke the next step here however you like
    console.log(content);   // Put all of the code here (not the best solution)
    processFile(content);   // Or put the next step in a function and invoke it
});

function processFile(content) {
    console.log(content);
}

Oder noch besser, wie Raynos Beispiel zeigt, verpacken Sie Ihren Aufruf in eine Funktion und übergeben Sie Ihre eigenen Rückrufe. (Offensichtlich ist dies die bessere Praxis) Ich denke, wenn Sie sich angewöhnen, Ihre asynchronen Aufrufe in eine Funktion zu verpacken, die einen Rückruf entgegennimmt, ersparen Sie sich eine Menge Ärger und unordentlichen Code.

function doSomething (callback) {
    // any async callback invokes callback with response
}

doSomething (function doSomethingAfter(err, result) {
    // process the async result
});

310voto

Logan Punkte 10099

Hierfür gibt es eine Synchronous-Funktion:

http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding

Asynchron

fs.readFile(filename, [encoding], [callback])

Liest asynchron den gesamten Inhalt einer Datei. Beispiel:

fs.readFile('/etc/passwd', function (err, data) {
  if (err) throw err;
  console.log(data);
});

Dem Callback werden zwei Argumente übergeben (err, data), wobei data der Inhalt der Datei ist.

Wenn keine Kodierung angegeben ist, wird der Rohpuffer zurückgegeben.


SYNCHRONOUS

fs.readFileSync(filename, [encoding])

Synchrone Version von fs.readFile. Gibt den Inhalt der Datei mit dem Namen filename zurück.

Wenn die Kodierung angegeben ist, gibt diese Funktion eine Zeichenkette zurück. Andernfalls gibt sie einen Puffer zurück.

var text = fs.readFileSync('test.md','utf8')
console.log (text)

124voto

Raynos Punkte 162170
function readContent(callback) {
    fs.readFile("./Index.html", function (err, content) {
        if (err) return callback(err)
        callback(null, content)
    })
}

readContent(function (err, content) {
    console.log(content)
})

75voto

Evan Carroll Punkte 1

Verwendung von Promises mit ES7

Asynchrone Verwendung mit mz/fs

En mz Modul stellt promisifizierte Versionen der Core Node Library zur Verfügung. Ihre Verwendung ist einfach. Installieren Sie zunächst die Bibliothek...

npm install mz

Dann...

const fs = require('mz/fs');
fs.readFile('./Index.html').then(contents => console.log(contents))
  .catch(err => console.error(err));

Alternativ können Sie sie auch in asynchronen Funktionen schreiben:

async function myReadfile () {
  try {
    const file = await fs.readFile('./Index.html');
  }
  catch (err) { console.error( err ) }
};

28voto

Aravin Punkte 5844

Diese Zeile wird funktionieren,

const content = fs.readFileSync('./Index.html', 'utf8');
console.log(content);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X