How to pipe to function in node.js?

前端 未结 3 1174
余生分开走
余生分开走 2021-02-19 23:02

I want to read from file to stream, pipe the output to a function that will upperCase the content and then write to file. This is my attempt. What am I doing wrong?



        
相关标签:
3条回答
  • 2021-02-19 23:23

    You have to use Transform if you want to "transform" streams. I recommend you to read: 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'))
    

    EDIT: You need to call .toString() in chunk because it's a buffer! :)

    0 讨论(0)
  • 2021-02-19 23:24

    Based on answer from Marco but tidied up:

    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'))
    
    0 讨论(0)
  • 2021-02-19 23:41

    Using async iteration is the cleaner new way to transform streams:

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

    As you can see, this way is a lot more terse and readable if you already are working in an async function context.

    0 讨论(0)
提交回复
热议问题