首页 > 解决方案 > 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() 一起工作?但是答案对我来说还不够,因为我不知道该怎么做,就像他在回答中所说的那样。如何关闭输入流?

标签: node.js

解决方案


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()以删除解码字符串末尾的换行符。


推荐阅读