Daten von fs.readFile abrufen

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

Logs undefined, warum?

Lösung

Um zu erläutern, was @Raynos gesagt hat, ist die Funktion, die Sie definiert haben, 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');
var content;
// First I want to read the file
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;

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

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

Oder noch besser, wie Raynos Beispiel zeigt, verpacken Sie Ihren Aufruf in eine Funktion und übergeben Sie Ihre eigenen Rückrufe. (Anscheinend ist das die bessere Praxis) Ich denke, wenn man sich angewöhnt, seine asynchronen Aufrufe in eine Funktion zu verpacken, die einen Callback aufnimmt, erspart man 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
});
Kommentare (4)

Hierfür gibt es eine Synchronous-Funktion:

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

Asynchron

fs.readFile(Dateiname, [Kodierung], [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 (err, data) übergeben, wobei data der Inhalt der Datei ist.

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


SYNCHRONOUS

fs.readFileSync(Dateiname, [Kodierung])

Synchrone Version von fs.readFile. Liefert den Inhalt der Datei mit dem Namen filename.

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

var text = fs.readFileSync('test.md','utf8')
console.log (text)
Kommentare (3)
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)
})
Kommentare (5)