Mendapatkan data dari fs.readFile

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

Log undefined, mengapa?

Mengomentari pertanyaan (2)
Larutan

Untuk menguraikan apa yang @Raynos mengatakan, fungsi yang telah didefinisikan adalah asynchronous callback. Itu doesn't mengeksekusi langsung, melainkan mengeksekusi ketika loading file telah selesai. Ketika anda menelepon readFile, kontrol kembali segera dan baris berikutnya kode dijalankan. Jadi, ketika anda menelepon konsol.log, anda callback belum dipanggil, dan konten ini belum ditetapkan. Selamat datang di pemrograman asynchronous.

Contoh pendekatan

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

Atau lebih baik lagi, sebagai Raynos contoh menunjukkan, bungkus memanggil fungsi dan lulus pada anda sendiri callback. (Rupanya ini adalah praktek yang lebih baik) saya pikir anda mendapatkan ke dalam kebiasaan membungkus async panggilan fungsi yang membutuhkan callback akan menghemat banyak masalah dan kode berantakan.

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

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

Sebenarnya ada fungsi Sinkron ini:

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

Asynchronous

fs.readFile(filename, [encoding], [panggil ulang])

Asynchronously membaca seluruh isi file. Contoh:

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

The callback adalah melewati dua argumen (err, data), di mana data adalah isi dari file.

Bila pengkodean tidak ditentukan, maka baku penyangga dikembalikan.


SINKRON

fs.readFileSync(filename, [encoding])

Synchronous versi fs.readFile. Kembali isi dari file bernama filename.

Bila pengkodean ditentukan maka fungsi ini akan mengembalikan sebuah string. Jika tidak maka kembali penyangga.

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

Menggunakan janji-Janji dengan ES7

Asynchronous dengan menggunakan mz/fs

The mz modul menyediakan promisified versi core node perpustakaan. Menggunakan mereka adalah sederhana. Pertama menginstal perpustakaan...

npm install mz

Kemudian...

const fs = require('mz/fs');
fs.readFile('./Index.html').then(contents => console.log(contents))
  .catch(err => console.error(err));

Atau anda dapat menulis mereka dalam asynchronous fungsi:

async function myReadfile () {
  try {
    const file = await fs.readFile('./Index.html');
  }
  catch (err) { console.error( err ) }
};
Komentar (3)
var data = fs.readFileSync('tmp/reltioconfig.json','utf8');

gunakan ini untuk memanggil file serentak, tanpa encoding untuk menampilkan output sebagai penyangga.

Komentar (2)

Baris ini akan bekerja,

const content = fs.readFileSync('./Index.html', 'utf8');
console.log(content);
Komentar (2)
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!");
      });
    });
  }
Komentar (2)

Seperti dikatakan, fs.readFile adalah asynchronous tindakan. Itu berarti bahwa ketika anda memberitahu node untuk membaca sebuah file, anda perlu mempertimbangkan bahwa itu akan mengambil beberapa waktu, dan sementara itu, node terus menjalankan kode berikut. Dalam kasus anda's: konsol.log(konten);.

It's seperti mengirim beberapa bagian dari kode anda untuk perjalanan panjang (seperti membaca sebuah file besar).

Lihatlah komentar-komentar yang saya've tertulis:

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

Yang's mengapa konten yang masih kosong ketika anda log itu. node belum diambil file's konten.

Ini bisa diselesaikan dengan memindahkan konsol.log(konten) di dalam fungsi callback, tepat setelah content = data;. Dengan cara ini anda akan melihat log ketika node selesai membaca file tersebut dan setelah konten mendapat nilai.

Komentar (0)

sinkron dan asinkron membaca file dengan cara:

//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 Cheat yang Tersedia di read_file.

Komentar (0)

Menggunakan dibangun di promisify perpustakaan (Node 8+) untuk membuat tua ini fungsi callback yang lebih elegan.

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);
  }
}
Komentar (3)
var fs = require('fs');
var path = (process.cwd()+"\\text.txt");

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

Ini adalah hanya karena node adalah asynchronous dan itu tidak akan menunggu untuk membaca fungsi dan segera setelah program dijalankan maka akan konsol nilai yang tidak terdefinisi, Yang benar-benar benar karena tidak ada nilai yang diberikan untuk isi variabel. Untuk mengatasinya kita dapat menggunakan janji-janji, generator dll. Kita dapat menggunakan berjanji dengan cara ini.

new Promise((resolve,reject)=>{
    fs.readFile('./index.html','utf-8',(err, data)=>{
        if (err) {
            reject(err); // in the case of error, control flow goes to the catch block with the error occured.
        }
        else{
            resolve(data);  // in the case of success, control flow goes to the then block with the content of the file.
        }
    });
})
.then((data)=>{
    console.log(data); // use your content of the file here (in this then).    
})
.catch((err)=>{
    throw err; //  handle error here.
})
Komentar (0)

Untuk menempatkan itu kira-kira, kau're berhadapan dengan node.js yang asinkron di alam.

Ketika kita berbicara tentang async, we're berbicara tentang melakukan atau pengolahan informasi atau data saat berhadapan dengan sesuatu yang lain. Hal ini tidak identik dengan paralel, mohon diingatkan.

Kode anda:

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

Dengan sampel anda, pada dasarnya tidak konsol.log bagian pertama, dengan demikian variabel 'isi' menjadi tidak terdefinisi.

Jika anda benar-benar ingin output, melakukan sesuatu seperti ini bukan:

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

Ini adalah asinkron. Ini akan sulit untuk mendapatkan digunakan untuk tetapi, itu adalah apa itu. Sekali lagi, ini adalah kasar tapi cepat penjelasan dari apa yang async.

Komentar (0)

anda dapat membaca file dengan

var readMyFile = function(path, cb) {
      fs.readFile(path, 'utf8', function(err, content) {
        if (err) return cb(err, null);
        cb(null, content);
      });
    };

Menambahkan pada anda dapat menulis ke file,

var createMyFile = (path, data, cb) => {
  fs.writeFile(path, data, function(err) {
    if (err) return console.error(err);
    cb();
  });
};

dan bahkan rantai bersama-sama

var readFileAndConvertToSentence = function(path, callback) {
  readMyFile(path, function(err, content) {
    if (err) {
      callback(err, null);
    } else {
      var sentence = content.split('\n').join(' ');
      callback(null, sentence);
    }
  });
};
Komentar (0)

Berikut adalah fungsi akan bekerja untuk async bungkus atau janji kemudian rantai

const readFileAsync = async (path) => fs.readFileSync(path, 'utf8');

Komentar (0)