Node.js NodeJS streams:WritableStream输出为零字节或非零字节,不一致

Node.js NodeJS streams:WritableStream输出为零字节或非零字节,不一致,node.js,Node.js,我在使用NodeJS流时遇到了一个奇怪的错误 问题描述: 如果我运行这个node.js脚本,最终文件(final_x.txt)有时是零字节,有时是正确的输出(即输入_x.txt的内容)。这是不一致的 const fs = require('fs'); const { pipeline } = require('stream'); (() => { function testStreamPipingWithFS() { var input = fs.createRe

我在使用NodeJS流时遇到了一个奇怪的错误

问题描述:

如果我运行这个node.js脚本,最终文件(final_x.txt)有时是零字节,有时是正确的输出(即输入_x.txt的内容)。这是不一致的

const fs = require('fs');
const { pipeline } = require('stream');

(() => {
    function testStreamPipingWithFS() {
        var input = fs.createReadStream('./input_x.txt', {autoClose: true});
        var output = fs.createWriteStream('./output_x.txt', {autoClose: true});
        
        pipeline(input, output, (err) => {
            if(err)
                console.log(err);
        });

        var intermediate = fs.createReadStream('./output_x.txt', {autoClose: true});
        var finalFile = './final_x.txt';
        var final = fs.createWriteStream(finalFile, {autoClose: true});
        
        pipeline(intermediate, final, (err) => {
            if(err)
                console.log(err);
        });
    }

    console.log(process.versions);
    testStreamPipingWithFS();

})();
环境:

Windows版本是Microsoft Windows[版本10.0.18363.959]

脚本记录的process.versions显示以下内容:

{
  node: '12.18.2',
  v8: '7.8.279.23-node.39',
  uv: '1.38.0',
  zlib: '1.2.11',
  brotli: '1.0.7',
  ares: '1.16.0',
  modules: '72',
  nghttp2: '1.41.0',
  napi: '6',
  llhttp: '2.0.4',
  http_parser: '2.9.3',
  openssl: '1.1.1g',
  cldr: '37.0',
  icu: '67.1',
  tz: '2019c',
  unicode: '13.0'
}

我错过了什么?感谢您的帮助。谢谢。

因为管道是异步的,所以需要将对管道的第二次调用放在对管道的第一次调用的回调中:

    function testStreamPipingWithFS() {
        
        var input = fs.createReadStream('./input_x.txt', {autoClose: true});
        var output = fs.createWriteStream('./output_x.txt', {autoClose: true});
        
        pipeline(input, output, (err) => {
            if(err)
                console.log(err);
            else {
                var intermediate = fs.createReadStream('./output_x.txt', {autoClose: true});
                var finalFile = './final_x.txt';
                var final = fs.createWriteStream(finalFile, {autoClose: true});
                
                pipeline(intermediate, final, (err) => {
                if(err)
                    console.log(err);
                });
            }
        })
    }

    testStreamPipingWithFS();

如果不在回调中进行第二次调用,则无法保证对管道的第一次调用将在对管道的第二次调用运行之前完成,因此您将得到不可预知的结果。

谢谢,@crosen9999。这是有道理的。我已经接受了你的回答。