Mengapa Node.js 'fs.readFile () mengembalikan buffer alih-alih string?

379

Saya mencoba membaca konten test.txt(yang ada di folder yang sama dengan sumber Javascript) dan menampilkannya menggunakan kode ini:

var fs = require("fs");

fs.readFile("test.txt", function (err, data) {
    if (err) throw err;
    console.log(data);
});

Konten test.txtdibuat pada nano:

Menguji Node.js readFile ()

Dan saya mendapatkan ini:

Nathan-Camposs-MacBook-Pro:node_test Nathan$ node main.js
<Buffer 54 65 73 74 69 6e 67 20 4e 6f 64 65 2e 6a 73 20 72 65 61 64 46 69 6c 65 28 29>
Nathan-Camposs-MacBook-Pro:node_test Nathan$ 
Nathan Campos
sumber

Jawaban:

562

Dari dokumen:

Jika tidak ada pengkodean yang ditentukan, maka buffer mentah dikembalikan.

Yang mungkin menjelaskan <Buffer ...>. Tentukan penyandian yang valid, misalnya utf-8, sebagai parameter kedua setelah nama file. Seperti,

fs.readFile("test.txt", "utf8", function(err, data) {...});
bersenang-senang
sumber
165

mencoba

fs.readFile("test.txt", "utf8", function(err, data) {...});

pada dasarnya Anda perlu menentukan pengkodean.

hvgotcodes
sumber
67

Ini muncul tinggi di Google, jadi saya ingin menambahkan beberapa informasi kontekstual tentang pertanyaan asli (penekanan saya):

Mengapa Node.js 'fs.readFile () mengembalikan buffer alih-alih string?

Karena file tidak selalu berupa teks

Bahkan jika Anda sebagai programmer tahu: Node tidak tahu apa yang ada dalam file yang ingin Anda baca. Ini bisa berupa file teks, tetapi bisa juga berupa arsip ZIP atau gambar JPG - Node tidak tahu.

Karena membaca file teks itu rumit

Bahkan jika Node tahu itu untuk membaca file teks, masih tidak akan tahu pengkodean karakter mana yang digunakan (yaitu bagaimana byte dalam file memetakan ke karakter yang dapat dibaca manusia), karena pengkodean karakter itu sendiri tidak disimpan dalam file tersebut .

Ada beberapa cara untuk menebak pengkodean karakter file teks dengan lebih atau kurang percaya diri (itulah yang dilakukan editor teks saat membuka file), tetapi Anda biasanya tidak ingin kode Anda mengandalkan tebakan tanpa instruksi eksplisit Anda.

Buffer untuk menyelamatkan!

Jadi, karena tidak dan tidak bisa mengetahui semua detail ini, Node hanya membaca file byte untuk byte, tanpa mengasumsikan apa pun tentang isinya.

Dan itulah buffer yang dikembalikan: wadah yang tidak terbuka untuk konten biner mentah. Bagaimana konten ini harus ditafsirkan terserah Anda sebagai pengembang.

Loilo
sumber
11
Ini adalah satu-satunya jawaban yang benar-benar menjawab pertanyaan dalam judul.
frzsombor
4
@ frzombor Mengingat ada jawaban yang diterima, saya berasumsi OP benar - benar tertarik untuk mendapatkan string daripada Buffer dan hanya tidak bisa mengutarakan pertanyaan dengan benar. Namun demikian, orang lain mungkin datang ke sini dari Google dengan "mengapa" yang sebenarnya dalam pikiran, maka jawaban saya. :)
Loilo
44

Async:

fs.readFile('test.txt', 'utf8', callback);

Sinkronkan:

var content = fs.readFileSync('test.txt', 'utf8');
Taro Alan
sumber
38

Itu mengembalikan objek Buffer.

Jika Anda menginginkannya dalam sebuah string, Anda dapat mengonversinya dengan data.toString():

var fs = require("fs");

fs.readFile("test.txt", function (err, data) {
    if (err) throw err;
    console.log(data.toString());
});
Andz
sumber
13
Agak lama, tetapi harus diketahui bahwa solusi ini memperkenalkan overhead tambahan karena buffer.toString()mengasumsikan utf-8 encoding. Dengan demikian, ini akan sama dengan (walaupun, lebih lambat dari) jawaban @hvgotcodes.
Brandon
14

The datavariabel berisi Bufferobjek. Konversikan ke dalam pengkodean ASCII menggunakan sintaks berikut:

data.toString('ascii', 0, data.length)

Secara serempak:

fs.readFile('test.txt', 'utf8', function (error, data) {
    if (error) throw error;
    console.log(data.toString());
});
ayusha
sumber