Saya meretas program Node yang digunakan smtp-protocol
untuk menangkap email SMTP dan bertindak atas data email. Perpustakaan menyediakan data email sebagai aliran, dan saya tidak tahu cara memasukkannya ke dalam string.
Saat ini saya menulisnya ke stdout stream.pipe(process.stdout, { end: false })
, tetapi seperti yang saya katakan, saya memerlukan data aliran dalam string, yang dapat saya gunakan setelah aliran berakhir.
Bagaimana cara mengumpulkan semua data dari aliran Node.js menjadi string?
javascript
node.js
stream
obrienmd
sumber
sumber
Jawaban:
(Jawaban ini dari beberapa tahun yang lalu, ketika itu adalah jawaban terbaik. Sekarang ada jawaban yang lebih baik di bawah ini. Saya belum mengikuti node.js, dan saya tidak dapat menghapus jawaban ini karena sudah ditandai "benar untuk pertanyaan ini ". Jika Anda berpikir untuk mengklik ke bawah, apa yang Anda ingin saya lakukan?)
Kuncinya adalah menggunakan peristiwa
data
danend
dari Arus yang Dapat Dibaca . Dengarkan acara ini:Saat Anda menerima
data
acara, tambahkan potongan data baru ke Buffer yang dibuat untuk mengumpulkan data.Saat Anda menerima
end
acara, ubah Buffer yang telah selesai menjadi string, jika perlu. Kemudian lakukan apa yang perlu Anda lakukan dengannya.sumber
Cara lain adalah dengan mengonversi aliran menjadi promise (lihat contoh di bawah) dan menggunakan
then
(atauawait
) untuk menetapkan nilai yang diselesaikan ke variabel.sumber
SyntaxError: await is only valid in async function
. Apa yang saya lakukan salah?streamToString(stream).then(function(response){//Do whatever you want with response});
.toString("utf8")
di akhir, untuk menghindari masalah kegagalan decode jika sebuah potongan terbelah di tengah karakter multibyte; (2) penanganan kesalahan yang sebenarnya; (3) menempatkan kode dalam suatu fungsi, sehingga dapat digunakan kembali, bukan disalin-tempel; (4) menggunakan Promises sehingga fungsinya dapatawait
diaktifkan; (5) kode kecil yang tidak menyeret jutaan dependensi, tidak seperti library npm tertentu; (6) sintaks ES6 dan praktik terbaik modern.Uncaught TypeError [ERR_INVALID_ARG_TYPE]: The "list[0]" argument must be an instance of Buffer or Uint8Array. Received type string
jika aliran menghasilkanstring
potongan, bukanBuffer
. Menggunakanchunks.push(Buffer.from(chunk))
harus bekerja dengan baikstring
danBuffer
potongan.Semua hal di atas tidak berhasil untuk saya. Saya perlu menggunakan objek Buffer:
sumber
Semoga ini lebih bermanfaat dari jawaban di atas:
Perhatikan bahwa penggabungan string bukanlah cara yang paling efisien untuk mengumpulkan bagian string, tetapi digunakan untuk kesederhanaan (dan mungkin kode Anda tidak mempedulikan efisiensi).
Selain itu, kode ini dapat menghasilkan kegagalan tak terduga untuk teks non-ASCII (mengasumsikan bahwa setiap karakter cocok dalam satu byte), tetapi mungkin Anda juga tidak peduli tentang itu.
sumber
join("")
array di akhir.Saya biasanya menggunakan fungsi sederhana ini untuk mengubah aliran menjadi string:
Contoh penggunaan:
sumber
chunks.push(chunk.toString());
Dan satu lagi untuk string menggunakan promise:
Pemakaian:
hapus
.toString()
untuk digunakan dengan Data biner jika diperlukan.update : @AndreiLED dengan benar menunjukkan bahwa ini memiliki masalah dengan string. Saya tidak bisa mendapatkan aliran yang mengembalikan string dengan versi node yang saya miliki, tetapi api mencatat hal ini dimungkinkan.
sumber
Uncaught TypeError [ERR_INVALID_ARG_TYPE]: The "list[0]" argument must be an instance of Buffer or Uint8Array. Received type string
jika aliran menghasilkanstring
potongan, bukanBuffer
. Menggunakanchunks.push(Buffer.from(chunk))
harus bekerja dengan baikstring
danBuffer
potongan.Dari dokumentasi nodejs Anda harus melakukan ini - selalu ingat string tanpa mengetahui encoding hanya sekumpulan byte:
sumber
Stream tidak memiliki
.toString()
fungsi sederhana (yang saya mengerti) atau sesuatu seperti.toStringAsync(cb)
fungsi (yang saya tidak mengerti).Jadi saya membuat fungsi pembantu saya sendiri:
sumber
Saya lebih beruntung menggunakan seperti itu:
Saya menggunakan node
v9.11.1
danreadstream
merupakan respon darihttp.get
panggilan balik.sumber
Solusi terbersih mungkin menggunakan paket "string-stream", yang mengonversi aliran menjadi string dengan janji.
sumber
Cara mudah dengan perpustakaan populer (lebih dari 5 juta unduhan mingguan) dan pustaka get-stream ringan :
https://www.npmjs.com/package/get-stream
sumber
Bagaimana dengan sesuatu seperti peredam aliran?
Berikut adalah contoh penggunaan kelas ES6 cara menggunakannya.
sumber
Ini berfungsi untuk saya dan didasarkan pada dokumen Node v6.7.0 :
sumber
setEncoding ('utf8');
Kerja bagus Sebastian J di atas.
Saya memiliki "masalah buffer" dengan beberapa baris kode pengujian yang saya miliki, dan menambahkan informasi pengkodean dan menyelesaikannya, lihat di bawah.
Tunjukkan masalahnya
perangkat lunak
memasukkan
keluaran
Peragakan solusinya
perangkat lunak
memasukkan
keluaran
sumber
Semua jawaban yang tercantum tampaknya membuka Stream yang Dapat Dibaca dalam mode mengalir yang bukan default di NodeJS dan dapat memiliki batasan karena tidak memiliki dukungan tekanan balik yang disediakan NodeJS dalam Mode Streaming Dapat Dibaca yang Dijeda. Berikut adalah implementasi menggunakan Just Buffer, Native Stream dan Native Stream Transforms dan dukungan untuk Object Mode
sumber
Apa pendapat Anda tentang ini?
sumber
Menggunakan paket yang cukup populer
stream-buffers
yang mungkin sudah Anda miliki di dependensi proyek Anda, ini cukup mudah:sumber
Dalam kasus saya, header respons tipe konten adalah Tipe-Konten: teks / biasa . Jadi, saya sudah membaca data dari Buffer seperti:
sumber