Node.js转换流只按原样传递数据

Node.js transform stream only passes through data as-is

本文关键字:数据 按原样 js 转换 Node      更新时间:2023-09-26

我试图创建一个小Node.js应用程序,可以读取Markdown文本并将其转换为HTML。为了实现这一点,我想创建一个转换流,它一次获取一个字符,计算其含义,然后返回它的HTML版本。

因此,例如,如果我传递转换流a *,它应该返回<b>(或</b>)。

然而,Transform流实际上并没有转换数据,无论我向它推送什么,它只是像我推送它一样返回,当我将console.log语句放入流的Transform方法中时,我没有看到任何输出,就好像该方法甚至没有被调用。

下面是带有Stream的文件:

module.exports = function returnStream() {
const Transform = require('stream').Transform;
let trckr = {
    bold: false
};
const compiler = new Transform({
    transform(chunk, encoding, done) {
        const input = chunk.toString();
        console.log(input); // No output
        let output;
        switch (input) {
          case '*':
            if (trckr.bold === true) {
              output = '</b>';
              trckr.bold = false;
            } else {
              output = '<b>';
              trckr.bold = true;
            }
            break;
        default:
            output = input;
    }
    done(null, output);
  }
});
  return compiler;
};

使用流的示例文件:

const transformS = require('./index.js')();
transformS.on('data', data => {
  console.log(data.toString());
});
transformS.push('*');

谢谢!

done(null, output)transformS.push()执行完全相同的功能:它们将数据推送到Transform流的可读的(输出)端。您需要做的不是调用transformS.push(),而是使用transformS.write('*')写入Transform流的可写(输入)端。

我还应该指出,您不应该在转换函数中对chunk的内容进行假设。它可以是一个字符或一组字符(在这种情况下,input 可能永远不会等于'*')。