如何在Node.js中将数据传递给函数?

15

我想从文件读取到流中,将输出管道传递给一个函数,该函数会将内容大写,然后写入文件。这是我的尝试,我做错了什么吗?

const fs = require('fs')

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

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

目前的错误是:

dest.on 不是一个函数


1
这个链接可能会有用:http://codewinds.com/blog/2013-08-20-nodejs-transform-streams.html#creating-custom-transform-streams - Dread Boy
1
阅读此文章:https://medium.freecodecamp.org/node-js-streams-everything-you-need-to-know-c9141306be93 - Medet Tleukabiluly
3个回答

19

根据Marco的回答进行整理:

const fs = require('fs')
const {Transform} = require('stream')

const upperCaseTransform = new Transform({
    transform: (chunk, encoding, done) => {
        const result = chunk.toString().toUpperCase()
        done(null, result)
    }
})

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

13

如果你想要“转换”流,你需要使用Transform。我建议你阅读: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'))

编辑: 因为chunk是一个缓冲区,所以需要在chunk中调用.toString()! :)


这里有点挑剔,但是 chunk.toString() 应该加上编码参数:chunk.toString(encoding)。这只有在不使用 'utf-8' 时才是问题,但你永远不知道。 - Michiel

4

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

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());
    }
})();

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接