javascript - 检查 Busboy 完成事件是否已经发生

标签 javascript node.js express

我有一个表单,需要在其中进行一些文件处理,这需要一些时间,所以我希望完成事件仅在处理完成后执行,现在 Node 正在处理文件,在处理文件并执行命令时, Node 如果找到完成事件,则会触发该事件。那么,我如何确保仅在处理完所有文件后才触发完成事件。

busboy.on('file', function(fieldname, file, filename,transferEncoding,mimeType) {
        var fName = uuid.v4();
        var fileext = filename.substr(filename.lastIndexOf('.') + 1);
        var filepath = path.normalize(__dirname + '/../../');
        var fstream = fs.createWriteStream(filepath+'/server/uploads/'+fName+'.'+fileext);
        var uploadFileCompletion = file.pipe(fstream);
        uploadFileCompletion.on('finish',function(){
            console.log('uploaded now');
            var cmd = 'libreoffice --headless --convert-to pdf --outdir '+ filepath + 'server/uploads ' + filepath + 'server/uploads/' + fName + '.' + fileext;
            exec(cmd, function(error,stdout,stderr){
                sys.puts(stdout);
                var encryptCmd = 'java -jar server/uploads/pdfbox-app-1.8.6.jar Encrypt -canAssemble false -canExtractContent false -canExtractForAccessibility false ' +
                    '-canModify false -canModifyAnnotations false -canPrint false -canPrintDegraded false server/uploads/' + fName + '.' + 'pdf'
                    + ' ' + 'server/uploads/' +fName + '.' + 'pdf';
                exec(encryptCmd, function(error,stdout,stderr){
                    fs.unlink(filepath+'server/uploads/'+fName + '.' + fileext, function(){
                        console.log("removed " +filepath+'server/uploads/'+fName + '.' + fileext);
                        actualFileName.push(filename);
                        storedFileName.push(fName+'.'+'pdf');
                    });
                });

            });
        });
    });
    busboy.on('field', function(fieldname, val, valTruncated,keyTruncated) {
        noteData = JSON.parse(val);
    });
    busboy.on('finish',function(){
        noteData.uploader = req.user.username;
        noteData.actualFileName = actualFileName;
        noteData.storedFileName = storedFileName;
        noteData.noteId = uuid.v4();
        Campusnotes.create(noteData,function(err,note){
            if(err){
                res.status(400);
                return res.send({reason:err.toString()});
            }
            console.log('finish');
            res.status(200);
            res.end();
        })
    });

现在控制台日志如下 -

finish
uploaded now
convert /home/unknown/public_html/campustop/server/uploads/8465f9a9-d6b7-4d53-8cb5-a8dbf3aed6a5.odt -> /home/unknown/public_html/campustop/server/uploads/8465f9a9-d6b7-4d53-8cb5-a8dbf3aed6a5.pdf using writer_pdf_Export

removed /home/unknown/public_html/campustop/server/uploads/8465f9a9-d6b7-4d53-8cb5-a8dbf3aed6a5.odt

表明完成事件一次又一次被触发

最佳答案

你可以尝试这样的事情:

var files = 0;
busboy.on('file', function(fieldname, file, filename,transferEncoding,mimeType) {
  ++files;
  var fName = uuid.v4();
  var fileext = filename.substr(filename.lastIndexOf('.') + 1);
  var filepath = path.normalize(__dirname + '/../../');
  var fstream = fs.createWriteStream(filepath+'/server/uploads/'+fName+'.'+fileext);
  file.pipe(fstream).on('finish',function() {
    console.log('uploaded now');
    var cmd = 'libreoffice --headless --convert-to pdf --outdir '+ filepath + 'server/uploads ' + filepath + 'server/uploads/' + fName + '.' + fileext;
    exec(cmd, function(error,stdout,stderr) {
      console.log(stdout);
      var encryptCmd = 'java -jar server/uploads/pdfbox-app-1.8.6.jar Encrypt -canAssemble false -canExtractContent false -canExtractForAccessibility false ' +
          '-canModify false -canModifyAnnotations false -canPrint false -canPrintDegraded false server/uploads/' + fName + '.' + 'pdf'
          + ' ' + 'server/uploads/' +fName + '.' + 'pdf';
      exec(encryptCmd, function(error,stdout,stderr) {
        fs.unlink(filepath+'server/uploads/'+fName + '.' + fileext, function() {
          console.log("removed " +filepath+'server/uploads/'+fName + '.' + fileext);
          actualFileName.push(filename);
          storedFileName.push(fName+'.'+'pdf');
        });
      });
      --files;
      onFinish();
    });
  });
});
busboy.on('field', function(fieldname, val, valTruncated,keyTruncated) {
  noteData = JSON.parse(val);
});
busboy.on('finish', onFinish);

function onFinish() {
  if (!busboy.writable && files === 0) {
    noteData.uploader = req.user.username;
    noteData.actualFileName = actualFileName;
    noteData.storedFileName = storedFileName;
    noteData.noteId = uuid.v4();
    Campusnotes.create(noteData,function(err,note){
      if (err){
        res.status(400);
        return res.send({reason:err.toString()});
      }
      console.log('finish');
      res.status(200);
      res.end();
    });
  }
}

在一个不相关的注释中,您可能应该对文件名进行一些清理/检查,有人可能是恶意的并使用类似 '../../../../../../../../../etc/passwd' (我不确定 createWriteStream() 是否解析/规范化给定的路径)。

关于javascript - 检查 Busboy 完成事件是否已经发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24632474/

相关文章:

javascript - 在 Chrome 开发工具时间线中 : What are the gray bars surrounding resource downloads in the network row?

javascript - 演示 Wi-Fi 的多人游戏

node.js - 如何从控制台读取 Node 错误?

mysql - 如何在 Sequelize 中实现聚类?

express - 一个expressjs应用程序的多个 View 目录

javascript - javascript中包含特殊字符的多行字符串?

javascript - 在单独的回调(函数)中访问 js 变量

sql-server - 从 Node.js 连接到 SQL Server 数据库

node.js - 如何使用聚合函数计算mongoDB中的唯一数据

angularjs - 在不同的服务器上序列化多个数据库