如何在node.js中管道起作用?

时间:2018-03-08 09:44:59

标签: node.js

我想从文件到流的读取,将输出传递给一个函数,该函数将对内容进行upperCase然后写入文件。这是我的尝试。我做错了什么?

const fs = require('fs')

const fred = q => {
    return q.toUpperCase()
}

fs.createReadStream('input.txt')
    .pipe(fred)
    .pipe(fs.createWriteStream('output.txt'))

目前错误是:

  

dest.on不是函数

3 个答案:

答案 0 :(得分:4)

如果你想要"转换"你必须使用转换。流。我建议你阅读:https://community.risingstack.com/the-definitive-guide-to-object-streams-in-node-js/

const fs = require('fs')

const Transform = require('stream').Transform;

  /// Create the transform stream:
  var uppercase = new Transform({
    decodeStrings: false
  });

  uppercase._transform = function(chunk, encoding, done) {
    done(null, chunk.toString().toUpperCase());
  };

fs.createReadStream('input.txt')
.pipe(uppercase)
.pipe(fs.createWriteStream('output.txt'))

编辑:你需要在块中调用.toString(),因为它是一个缓冲区! :)

答案 1 :(得分:2)

根据Marco的回答但整理了一下:

get

答案 2 :(得分:2)

使用异步迭代是转换流的更干净的新方法:

const fs = require('fs');
(async () => {
    const out = fs.createWriteStream('output.txt');
    for await (const chunk of fs.createReadStream('input.txt', 'utf8')) {
        out.write(chunk.toUpperCase());
    }
})();

如您所见,如果您已经在异步函数上下文中工作,则这种方式更简洁易读。