2014-07-08 1 views
0

약간의 시간이 걸리는 파일 처리가 필요한 양식이 있으므로 처리가 완료된 후에 만 ​​finish 이벤트를 실행하고 싶습니다. 노드 파일을 처리하는 중이고 파일을 처리하는 동안 노드가 명령을 실행하면 완료 이벤트가 발생하여 노드가 실행됩니다. 그래서, 어떻게 완료 이벤트가 모든 파일을 처리 한 후 해고되었는지 확인합니다. 다음과 같이busboy finish 이벤트가 이미 발생했는지 확인

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 

가 마무리 이벤트가 다시 해고지고 있음을 나타내는 다시

+0

불필요한 지연과 서버 리소스 낭비를 추가하는 전체 동기 방식을 사용하고 싶지 않습니다. 그래서 내부 이벤트 나 뭔가 내부의 변수에 대한 감시자를 만드는 방법이 있습니다. – DeadMan

답변

2

당신은 같은 것을 시도 할 수 :

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

관련없는 참고 사항에서 파일 이름의 일부 위생/검사를 수행해야합니다. ne는 악의적 일 수 있고 '../../../../../../../../../etc/passwd'과 같은 것을 사용할 수 있습니다 (createWriteStream()이 주어진 경로를 해석/정규화하는지 확실하지 않습니다).

+0

괜찮습니다. 파일 이름 문제를 입력 해 주셔서 감사합니다. 팀 파트너에게 이러한 모든 문제를 해결하도록 요청했습니다. – DeadMan

관련 문제