fs.readFile dosyasından veri alın

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

Loglar tanımlanmamış, neden?

Çözüm

Raynos'un söylediklerini detaylandırmak gerekirse, tanımladığınız fonksiyon asenkron bir geri çağırmadır. Hemen çalışmaz, bunun yerine dosya yükleme işlemi tamamlandığında çalışır. ReadFile'ı çağırdığınızda, kontrol hemen geri döndürülür ve bir sonraki kod satırı yürütülür. Yani console.log'u çağırdığınızda, geri aramanız henüz çağrılmamıştır ve bu içerik henüz ayarlanmamıştır. Asenkron programlamaya hoş geldiniz.

Örnek yaklaşımlar

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

Ya da daha iyisi, Raynos örneğinin gösterdiği gibi, çağrınızı bir fonksiyona sarın ve kendi geri aramalarınızı iletin. (Görünüşe göre bu daha iyi bir uygulama) Bence asenkron çağrılarınızı geri çağrı alan bir fonksiyona sarma alışkanlığı edinmek sizi çok fazla sorundan ve dağınık koddan kurtaracaktır.

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

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

Aslında bunun için bir Eşzamanlı işlev vardır:

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

Asenkron

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

Eşzamanlı olarak bir dosyanın tüm içeriğini okur. Örnek:

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

Geri çağrıya iki argüman (err, data) aktarılır, burada data dosyanın içeriğidir._

Kodlama belirtilmezse, ham tampon döndürülür.


SYNCHRONOUS

fs.readFileSync(filename, [encoding])

Fs.readFile'ın eşzamanlı sürümü. dosyaadı. adlı dosyanın içeriğini döndürür.

Eğer kodlama belirtilirse, bu fonksiyon bir dize döndürür. Aksi takdirde bir tampon döndürür.

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