Node.js Stream:-Streams函数不会对同一文件进行第二次调用

Node.js Stream :- Streams functions are not invoking for second time for same file

本文关键字:文件 调用 第二次 Stream js -Streams 函数 Node      更新时间:2023-09-26

SFTB,我有一个POST请求带着multipart/form-data来到我的服务器,现在我想从该请求中获取文件的内容。

我正在读取通过streams提供的文件,并将其管道传输到cvsParser,CCD_4只是csv-streamify的一个实例。在此之后,我们将内容传递到自定义Transform函数,该函数使用http获取资源[我使用got获取资源],并在获取后压缩图像。

现在的问题是,当我第一次提交文件时,它的工作方式很有魅力,但当我第二次尝试提交同一个文件时,会跳过整个stream部分,直接跳到finish事件处理程序。

首次记录:-

Submitting
Converting image at C:'image-minifier-sqd'build'src'1469004088476.bell.svg
Build is present at build'dest'1469004088476.bell.svg
Converting image at C:'image-minifier-sqd'build'src'1469004088996.mail.svg
Build is present at build'dest'1469004088996.mail.svg
Finished

当我第二次提交同一文件时记录[在前端进行刷新和不进行刷新]

Submitting
Finished

仅供参考,在前端,我正在使用fetch API进行POST请求。

我的服务器代码:-

function createParser() {
  var parser = new Transform({objectMode: true});
  parser._transform = function(data, encoding, done) {
    const date = new Date();
    const link = data.toString().slice(2,-3);
    const fileName = date.getTime()+ '.' +link.split( '/' ).pop(),
          filePath = path.resolve(__dirname,`build/src/${fileName}`);
    got.stream(link)
    .pipe(fs.createWriteStream(filePath,{flags:'a'}))
    .on('close',_ => {
      console.log(`Converting image at ${filePath}`)
      //Compressing images
      imagemin([filePath],'build/dest',{
        plugins: [
          imageminMozjpeg(),
          imageminPngquant({speed: 10}),
          imageminSvgo(),
          imageminGifsicle()
        ]
      })
      .then(file => {
        console.log(`Build is present at ${file[0].path}`);
        this.push(file[0].path);
        done(); 
      }); 
    });  
  };
  return parser;
}
//A request comes here with multipart/form-data
app.post('/submit/csv',upload.array('data'),(req, res) => {
  console.log('Submitting')
  const stream = fs.createReadStream(path.resolve(__dirname,req.files[0].path))
                  .pipe(csvParser)
                  .pipe(createParser())
                  .pipe(res)
                  .on('finish',_ => {
                    log('Finished');
                    res.end();
                  });
});

谢谢。

我认为问题与csvParser的重用有关。尝试将csvParser的创建包装在一个函数中,并使用它:

function createCsvParser() {
    const parser = csv();
    parser.on('data', function (line) {
        [...]
    });
    return parser;
}

14变为CCD_ 15。

希望这能有所帮助。