Я использую библиотеку ya-csv , которая ожидает либо файл, либо поток в качестве входных данных, но у меня есть строка.
Как мне преобразовать эту строку в поток в Node?
источник
Я использую библиотеку ya-csv , которая ожидает либо файл, либо поток в качестве входных данных, но у меня есть строка.
Как мне преобразовать эту строку в поток в Node?
Начиная с узла 10.17, stream.Readable имеет from
метод, позволяющий легко создавать потоки из любой итерируемой (которая включает литералы массива):
const { Readable } = require("stream")
const readable = Readable.from(["input string"])
readable.on("data", (chunk) => {
console.log(chunk) // will be called once with `"input string"`
})
Обратите внимание, что, по крайней мере, между 10.17 и 12.3 строка сама по себе является итеративной, поэтому Readable.from("input string")
будет работать, но генерировать одно событие на символ. Readable.from(["input string"])
будет генерировать одно событие на элемент в массиве (в данном случае один элемент).
Также обратите внимание, что в более поздних узлах (вероятно, 12.3, так как в документации говорится, что функция была изменена тогда), больше нет необходимости заключать строку в массив.
https://nodejs.org/api/stream.html#stream_stream_readable_from_iterable_options
Как @substack исправил меня в #node , новый API потоков в Node v10 делает это проще:
... после чего вы можете свободно трубы он или иным образом передать его предполагаемого потребителя.
Это не так чисто, как возобновить однострочно, но это позволяет избежать дополнительной зависимости.
( Обновление: в версиях от 0.10.26 до v9.2.1, вызов
push
напрямую из приглашения REPL завершится сnot implemented
исключением, если вы не установили_read
. Он не будет зависать внутри функции или скрипта. Если несогласованность делает вас нервный, включиnoop
.)источник
_read
метод для извлечения данных из базового ресурса».null
вставляете в буфер потока?null
сообщает потоку, что он завершил чтение всех данных и закрывает потокreadable.push()
Метод предназначен для вызова только читаемыми реализаторами и только изreadable._read()
метода».Не используйте ответ Джо Лисса. В большинстве случаев это будет работать, но в моем случае я потерял 4 или 5 часов поиска ошибок. Для этого не нужны сторонние модули.
НОВЫЙ ОТВЕТ :
Это должен быть полностью совместимый поток для чтения. Смотрите здесь для получения дополнительной информации о том, как правильно использовать потоки.
СТАРЫЙ ОТВЕТ : Просто используйте собственный поток PassThrough:
Обратите внимание, что событие 'close' не генерируется (что не требуется для потоковых интерфейсов).
источник
Просто создайте новый экземпляр
stream
модуля и настройте его в соответствии с вашими потребностями:или
источник
pipe()
должен возвращать целевой поток, по крайней мере.Изменить: ответ Гарт, вероятно, лучше.
Мой старый текст ответа сохраняется ниже.
Для того, чтобы преобразовать строку в поток, вы можете использовать паузу через поток:
Пример:
источник
resumer
работало довольно хорошо. Спасибо!Для этого есть модуль: https://www.npmjs.com/package/string-to-stream
источник
в кофе-скрипте:
используй это:
источник
Другое решение - передать функцию чтения в конструктор Readable (см. Параметры чтения потока cf doc )
Вы можете после использования s.pipe для примера
источник
Я устал от переучивания этого каждые шесть месяцев, поэтому я просто опубликовал модуль npm, чтобы абстрагировать детали реализации:
https://www.npmjs.com/package/streamify-string
Это ядро модуля:
str
это то,string
что должно быть передано конструктору при вызове и будет выведено потоком в виде данных.options
Типичные параметры, которые могут быть переданы в поток, согласно документации .Согласно Travis CI, он должен быть совместим с большинством версий узла.
источник
Вот простое решение в TypeScript:
источник
JavaScript является утилитарным, поэтому, если вы просто скопируете API читаемого потока , он будет работать просто отлично. Фактически, вы, вероятно, не можете реализовать большинство этих методов или просто оставить их как заглушки; все, что вам нужно реализовать - это то, что использует библиотека. Вы также можете использовать предварительно созданный
EventEmitter
класс Node для работы с событиями, так что вам не придется реализовыватьaddListener
и тому подобное самостоятельно.Вот как вы можете реализовать это в CoffeeScript:
Тогда вы можете использовать это так:
источник
TypeError: string is not a function at String.CALL_NON_FUNCTION (native)
когда я использую это какnew StringStream(str).send()
stream.Readable
подобный предложенному @Garth Kidd.stream.Readable
не существовало, когда я написал этот ответ.