Hent data fra fs.readFile

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

Logger udefinert, hvorfor?

Løsning

For å utdype det @Raynos sa, er funksjonen du har definert en asynkron tilbakeringing. Den kjøres ikke med en gang, men når filinnlastingen er fullført. Når du kaller readFile, returneres kontrollen umiddelbart og neste kodelinje kjøres. Så når du kaller console.log, har tilbakeringingen din ennå ikke blitt påkalt, og dette innholdet er ennå ikke angitt. Velkommen til asynkron programmering.

Eksempel på tilnærminger

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

Eller enda bedre, som Raynos eksempel viser, pakk inn anropet ditt i en funksjon og send inn dine egne tilbakeringinger. (Tilsynelatende er dette bedre praksis) Jeg tror det å bli vant til å pakke inn async-anropene dine i en funksjon som tar en tilbakeringing, vil spare deg for mye trøbbel og rotete kode.

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

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

Det finnes faktisk en synkron funksjon for dette:

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

Asynchronous

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

Asynkront leser hele innholdet i en fil. Eksempel:

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

Tilbakekallingen får to argumenter (err, data), der data er innholdet i filen.

_Hvis ingen koding er spesifisert, returneres råbufferen.


SYNCHRONOUS

fs.readFileSync(filnavn, [koding])

Synkron versjon av fs.readFile. Returnerer innholdet i filen med navnet filnavn.

_Hvis koding er angitt, returnerer denne funksjonen en streng. Ellers returnerer den en buffer.

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