Saya menggunakan perpustakaan, ya-csv , yang mengharapkan file atau aliran sebagai input, tetapi saya memiliki string.
Bagaimana cara mengubah string itu menjadi aliran di Node?
sumber
Saya menggunakan perpustakaan, ya-csv , yang mengharapkan file atau aliran sebagai input, tetapi saya memiliki string.
Bagaimana cara mengubah string itu menjadi aliran di Node?
Dari node 10.17, stream.Readable memiliki from
metode untuk dengan mudah membuat stream dari setiap iterable (yang mencakup array literal):
const { Readable } = require("stream")
const readable = Readable.from(["input string"])
readable.on("data", (chunk) => {
console.log(chunk) // will be called once with `"input string"`
})
Perhatikan bahwa setidaknya antara 10,17 dan 12,3, string itu sendiri merupakan iterable, jadi Readable.from("input string")
akan berfungsi, tetapi memancarkan satu peristiwa per karakter. Readable.from(["input string"])
akan memancarkan satu peristiwa per item dalam array (dalam hal ini, satu item).
Perhatikan juga bahwa pada node-node yang lebih baru (mungkin 12.3, karena dokumentasi mengatakan bahwa fungsi diubah kemudian), tidak perlu lagi membungkus string dalam sebuah array.
https://nodejs.org/api/stream.html#stream_stream_readable_from_iterable_options
Ketika @substack mengoreksi saya di #node , API aliran baru di Node v10 membuat ini lebih mudah:
... setelah itu kamu bisa bebas pipa atau memberikannya kepada konsumen yang Anda tuju.
Ini tidak sebersih resumer one-liner, tetapi tidak menghindari ketergantungan ekstra.
( Pembaruan: di v0.10.26 hingga v9.2.1 sejauh ini, panggilan
push
langsung dari prompt REPL akan macet dengannot implemented
pengecualian jika Anda tidak mengatur_read
. Itu tidak akan crash di dalam suatu fungsi atau skrip. Jika inkonsistensi membuat Anda gugup, termasuknoop
.)sumber
_read
metode untuk mengambil data dari sumber daya yang mendasarinya."null
ke buffer aliran?null
memberitahu stream bahwa ia telah selesai membaca semua data dan untuk menutup streamreadable.push()
Metode ini dimaksudkan hanya dipanggil oleh Pelaksana yang Dapat Dibaca, dan hanya dari dalamreadable._read()
metode."Jangan gunakan jawaban pelanggan Jo Liss. Ini akan berfungsi dalam kebanyakan kasus, tetapi dalam kasus saya kehilangan saya menemukan bug yang baik 4 atau 5 jam. Tidak perlu modul pihak ketiga untuk melakukan ini.
JAWABAN BARU :
Ini harus menjadi aliran yang Dapat Dibaca sepenuhnya sesuai. Lihat di sini untuk info lebih lanjut tentang cara menggunakan stream dengan benar.
JAWABAN TUA : Cukup gunakan aliran PassThrough asli:
Perhatikan bahwa acara 'tutup' tidak dipancarkan (yang tidak diperlukan oleh antarmuka aliran).
sumber
Cukup buat instance baru dari
stream
modul dan sesuaikan dengan kebutuhan Anda:atau
sumber
pipe()
seharusnya mengembalikan aliran tujuan, setidaknya.Sunting: Jawaban Garth mungkin lebih baik.
Teks jawaban lama saya disimpan di bawah ini.
Untuk mengkonversi string ke sungai, Anda dapat menggunakan berhenti melalui aliran:
Contoh:
sumber
resumer
bekerja dengan cukup baik. Terima kasih!Ada modul untuk itu: https://www.npmjs.com/package/string-to-stream
sumber
dalam naskah kopi:
Gunakan:
sumber
Solusi lain adalah meneruskan fungsi baca ke konstruktor yang Dapat Dibaca (cf doc stream readeable options )
Anda bisa setelah menggunakan s.pipe untuk contoh
sumber
Saya bosan harus mempelajarinya kembali setiap enam bulan, jadi saya baru saja menerbitkan modul npm untuk meringkas detail implementasi:
https://www.npmjs.com/package/streamify-string
Ini adalah inti dari modul:
str
adalahstring
yang harus diteruskan ke konstruktor setelah invokasi, dan akan dikeluarkan oleh aliran sebagai data.options
adalah opsi khas yang dapat diteruskan ke aliran, per dokumentasi .Menurut Travis CI, itu harus kompatibel dengan sebagian besar versi node.
sumber
Inilah solusi yang rapi dalam TypeScript:
sumber
JavaScript bertipe bebek, jadi jika Anda hanya menyalin API aliran yang dapat dibaca , itu akan bekerja dengan baik. Faktanya, Anda mungkin tidak dapat mengimplementasikan sebagian besar metode tersebut atau membiarkannya saja; yang Anda perlukan untuk mengimplementasikan adalah apa yang digunakan perpustakaan. Anda dapat menggunakan
EventEmitter
kelas pra-bangun Node untuk menangani acara juga, jadi Anda tidak harus mengimplementasikannyaaddListener
dan melakukannya sendiri.Inilah cara Anda menerapkannya di CoffeeScript:
Maka Anda bisa menggunakannya seperti ini:
sumber
TypeError: string is not a function at String.CALL_NON_FUNCTION (native)
ketika saya menggunakannya sepertinew StringStream(str).send()
stream.Readable
seperti @Garth Kidd yang disarankan.stream.Readable
tidak ada ketika saya menulis jawaban ini.