Duomenų gavimas iš fs.readFile

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

Žurnalai neapibrėžti, kodėl?

Sprendimas

Norėdamas patikslinti tai, ką pasakė @Raynos, noriu pasakyti, kad jūsų apibrėžta funkcija yra asinchroninis grįžtamasis skambutis. Ji nevykdoma iš karto, o įvykdoma, kai baigiamas failo įkėlimas. Kai iškviečiate readFile, valdymas grąžinamas iš karto ir vykdoma kita kodo eilutė. Taigi, kai iškviečiate console.log, jūsų grįžtamasis iškvietimas dar nėra įvykdytas ir šis turinys dar nenustatytas. Sveiki atvykę į asinchroninį programavimą.

Pavyzdžių metodai

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

Arba dar geriau, kaip rodo Raynos pavyzdys, įvilkite savo iškvietimą į funkciją ir perduokite savo atgalinius iškvietimus. (Matyt, tai geresnė praktika) Manau, kad įpratę asinchroninius iškvietimus įtraukti į funkciją, kuri priima grįžtamąjį ryšį, išvengsite daug rūpesčių ir netvarkingo kodo.

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

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

Tam iš tikrųjų yra sinchroninė funkcija:

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

Asinchroninė

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

Asinchroniškai perskaito visą failo turinį. Pavyzdys:

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

_Grįžtamajam skambučiui perduodami du argumentai (err, data), kur data yra failo turinys.

_Jeigu nenurodyta koduotė, grąžinamas neapdorotas buferis.


SYNCHRONOUS

fs.readFileSync(filename, [encoding])

_Sinchroninė fs.readFile versija. Grąžinamas failo, pavadinto filename, turinys.

Jeigu nurodyta koduotė, ši funkcija grąžina eilutę. Priešingu atveju ji grąžina buferį.

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