node.js - Concat-stream 回调不调用
问题描述
这是代码
concat = require('concat-stream');
const writable = concat(cb);
let reversedData = ''
function cb(data) {
reversedData = data.toString().split('').reverse().join('');
process.stdout.write(reversedData)
}
process.stdin.pipe(writable);
它只是接受输入而不是输出。怎么了 ?
编辑:这个问题与为什么 concat-stream 不能与 process.stdin.pipe() 一起工作?但是答案对我来说还不够,因为我不知道该怎么做,就像他在回答中所说的那样。如何关闭输入流?
解决方案
concat-stream
使用with没有意义,process.stdin
因为concat-stream
期望可读流在某个时候结束,但process.stdin
不会结束。
Transform
只使用普通流会更有意义:
const { pipeline, Transform } = require('stream');
const { StringDecoder } = require('string_decoder');
const decoder = new StringDecoder();
// Transfrom stream which reverses input
const reverse = new Transform({
transform(chunk, encoding, callback) {
// Convert input from buffer to string
chunk = decoder.write(chunk).trim();
// Reverse string
chunk = chunk.split('').reverse().join('');
// Return result
callback(null, chunk);
}
});
// Pipe console input into transform stream then into console output
pipeline(process.stdin, reverse, process.stdout, err => {
throw err;
});
我使用
pipeline()
了代替,.pipe()
以便在发生错误时可以将错误处理程序添加到末尾。StringDecoder
用于将接收到的缓冲区转换process.stdin
为 UTF-8 字符串。.trim()
在末尾使用decoder.write(chunk).trim()
以删除解码字符串末尾的换行符。
推荐阅读
- ffmpeg - FFMPEG & YouTube Live - “Bad Video Settings” - 请使用 4 秒或更短的关键帧频率
- regex - 如何在过滤器pyspark RDD中过滤掉某种模式
- sql - FROM 子句中的大查询连接字符串
- ruby-on-rails - Heroku Release Phase 配置变量在变量名中带有点
- docker - Docker端口冲突,即使没有绑定端口
- css - 全屏打印 MaterialUI 对话框
- gltf - 文件glTF中的角度单位是什么?
- css - 响应式设计 html 格格不入
- html - 如何在 991px 宽的平板电脑上强制使用 Bootstrap 中的汉堡菜单?
- regex - Kotlin 正则表达式空间有效,但字边界无效