javascript - fs.readFile'den veri alma
var content;
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
});
console.log(content);
Günlükler undefined gösteriyor, neden?
Cevap #1
@Raynos'un söylediklerini açıklamak gerekirse, tanımladığınız fonksiyon bir asenkron geri çağırmadır. Hemen çalışmaz, dosya yüklemesi tamamlandığında çalışır. readFile çağrıldığında, kontrol hemen geri döner ve sonraki kod satırı yürütülür. Bu nedenle console.log’u çağırdığınızda, geri çağrmanı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');
// 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);
}
Ya da Raynos örneğinin gösterdiği gibi, çağrınızı bir fonksiyon içine sarın ve kendi geri çağrılarını geçin. (Görünüşe göre bu daha iyi bir uygulama) Asenkron çağrılarınızı bir geri çağrı alan bir fonksiyon içinde sarmayı alışkanlık haline getirmenin size birçok sorun ve karmaşık koddan kurtaracağını düşünüyorum.
function doSomething (callback) {
// any async callback invokes callback with response
}
doSomething (function doSomethingAfter(err, result) {
// process the async result
});
Cevap #2
Aslında bunun için bir Senkron fonksiyon vardır:
http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding
Asenkron
fs.readFile(filename, [encoding], [callback])Bir dosyanın tüm içeriğini eşzamansız olarak okur. Örnek:
fs.readFile('/etc/passwd', function (err, data) {
if (err) throw err;
console.log(data);
});
Geri arama iki argüman alır (err, data), burada data dosyanın içeriğidir.
Eğer bir kodlama belirtilmemişse, ham bellek döndürülür.
EŞZAMANLI
fs.readFileSync(filename, [encoding])fs.readFile'in senkron sürümü. filename adlı dosyanın içeriğini döndürür.
Eğer kodlama belirtilmişse, bu fonksiyon bir dize döner. Aksi takdirde bir tampon döner.
var text = fs.readFileSync('test.md','utf8')
console.log (text)
Cevap #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)
})
Cevap #4
ES7 ile Promiselerin Kullanımı
mz/fs ile eşzamansız kullanım
mz modülü, çekirdek node kütüphanesinin promisli sürümlerini sağlar. Kullanımı basittir. Öncelikle kütüphaneyi yükleyin...
npm install mz
Sonra...
const fs = require('mz/fs');
fs.readFile('./Index.html').then(contents => console.log(contents))
.catch(err => console.error(err));
Alternatif olarak bunları eşzamansız fonksiyonlarda yazabilirsiniz:
async function myReadfile () {
try {
const file = await fs.readFile('./Index.html');
}
catch (err) { console.error( err ) }
};
Cevap #5
Bu satır çalışacak,
const content = fs.readFileSync('./Index.html', 'utf8');
console.log(content);
Cevap #6
var data = fs.readFileSync('tmp/reltioconfig.json','utf8');
Bu, bir dosyayı eşzamanlı olarak çağırmak için kullanılabilir, çıktısını kodlamadan bir buffer olarak gösterir.
Cevap #7
Belirtildiği gibi, fs.readFile bir asenkron işlemdir. Bu, node'a bir dosya okumasını söylediğinizde, bunun biraz zaman alacağını ve bu süre zarfında node'un aşağıdaki kodu çalıştırmaya devam edeceğini anlamanız gerektiği anlamına gelir. Sizin durumunuzda bu: console.log(content);.
Bu, kodunuzun bir kısmını uzun bir yolculuğa göndermek gibidir (büyük bir dosya okumak gibi).
Yazdığım yorumlara bir bak.
var content;
// node, go fetch this file. when you come back, please run this "read" callback function
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
});
// in the meantime, please continue and run this console.log
console.log(content);
İşte bu yüzden content 'i kaydettiğinizde hâlâ boş. Node dosyanın içeriğini henüz almadı.
Bu, console.log(content)'i geri çağırma fonksiyonunun içine, content=data;'den hemen sonra taşımakla çözülebilir, değil mi? Bu şekilde, node dosyayı okumayı bitirdiğinde ve content bir değer aldığında log'u göreceksiniz.
Cevap #8
Node v8'den itibaren
Bu eski geri çağırma fonksiyonlarını daha zarif hale getirmek için yerleşik promisify kütüphanesini kullanın.
const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
async function doStuff() {
try {
const content = await readFile(filePath, 'utf8');
console.log(content);
} catch (e) {
console.error(e);
}
}
Node v10'dan itibaren
fs API'sinin söz promises (vaadler) sürümünü kullanabilirsiniz:
import { promises as fs } from 'fs';
async function doStuff() {
try {
const content = await fs.readFile(filePath, 'utf8');
console.log(content);
} catch (e) {
console.error(e);
}
}
Cevap #9
const fs = require('fs')
function readDemo1(file1) {
return new Promise(function (resolve, reject) {
fs.readFile(file1, 'utf8', function (err, dataDemo1) {
if (err)
reject(err);
else
resolve(dataDemo1);
});
});
}
async function copyFile() {
try {
let dataDemo1 = await readDemo1('url')
dataDemo1 += '\n' + await readDemo1('url')
await writeDemo2(dataDemo1)
console.log(dataDemo1)
} catch (error) {
console.error(error);
}
}
copyFile();
function writeDemo2(dataDemo1) {
return new Promise(function(resolve, reject) {
fs.writeFile('text.txt', dataDemo1, 'utf8', function(err) {
if (err)
reject(err);
else
resolve("Promise Success!");
});
});
}
Cevap #10
senkron ve asenkron dosya okuma yolu:
//fs module to read file in sync and async way
var fs = require('fs'),
filePath = './sample_files/sample_css.css';
// this for async way
/*fs.readFile(filePath, 'utf8', function (err, data) {
if (err) throw err;
console.log(data);
});*/
//this is sync way
var css = fs.readFileSync(filePath, 'utf8');
console.log(css);
Node Hilesi read_file üzerinde mevcut.
