2017-04-13 8 views
-1

node.js에 is가 생성 된 직후에 pdf를 삭제하려고합니다. 생성 된 pdf는 전자 메일 첨부 파일로 전송되어 dropbox에 업로드 된 다음 로컬 파일 시스템에서 삭제됩니다. 하지만 삭제하려고하면 삭제되지 않으며 이메일도 보내지 않습니다. pdf는 html-pdf을 사용하여 생성됩니다. 내가 할 때 파일이 이미 작동하지만, 경우에 따라서 fs.unlink' or fs.unlinkSync`가, 경로로 생성되는 파일이 삭제되지 않습니다Nodejs 생성 된 파일 즉시 삭제

 if (result) { 
     var filename = user.number+ ".pdf"; 
     var path = './public/files/'+filename ; 
     var options = { filename: path, format: 'Legal', orientation: 'portrait', directory: './public/files/',type: "pdf" }; 
     html = result; 
     pdf.create(html, options).toFile(function(err, res) { 
     if (err) return console.log(err); 
     console.log(res); 
     }); 
    var dbx = new dropbox({ accessToken: mytoken }); 
    fs.readFile(path,function (err, contents) { 
      if (err) { 
        console.log('Error: ', err); 
      } 
      dbx.filesUpload({ path: "/"+filename ,contents: contents }) 
          .then(function (response) { 
          console.log("done") 
          console.log(response); 
          }) 
          .catch(function (err) { 
          console.log(err); 
          }); 
          }); 

      var mailOptions = { 
      from: 'xyz', // sender address 
      to: user.email, // list of receivers 
      subject: 'Confirmation received', // Subject line 
      attachments : [{ 
          filename: filename, 
          path : path                   
          }] 
        }; 

      transporter.sendMail(mailOptions, (error, info) => { 
       if (error) { 
           return console.log(error); 
          } 
           console.log('Message %s sent: %s', info.messageId, info.response); 

           }); 
      fs.unlinkSync(path); // even tried fs.unlink , does not delete file 
      // fs.unlinkSync(someother file); this one works 
} 

: 여기 내 코드입니다.

+1

당신은 이메일을 전송 완료 될 때까지 기다릴 필요가 ..해야한다. – SLaks

+0

console.log가 가장 친한 친구입니다.'unlinkSync (path)'대신에 무엇인가를 출력하면 –

답변

0

NodeJs는 비동기이므로 모든 블록을 올바르게 처리해야합니다. 귀하의 코드에 따르면 PDF 생성이 느린 경우 PDF 자체를 완전히 작성하기 전에 잠자기 보관함에 파일 업로드가 시작될 때가 있습니다.

메일을 보내기 전에 PDF 파일이 삭제되므로 오류가 발생하지만 fs.unlink()에 오류가 기록되지 않았습니다. 코드를 블록으로 나누고 더 나은 성능과 흐름을 위해 콜백을 사용하십시오. 이 제대로 작동하려면 같은

코드는

if (result) { 
var filename = user.number+ ".pdf"; 
var path = './public/files/'+filename ; 
var options = { filename: path, format: 'Legal', orientation: 'portrait', directory: './public/files/',type: "pdf" }; 
html = result; 
//Generate the PDF first 
pdf.create(html, options).toFile(function(err, res) { 
    if (err){ 
    return console.log(err); 
    } else { 
     //If success then read the PDF file and then upload to dropbox 
    var dbx = new dropbox({ accessToken: mytoken }); 
    fs.readFile(path,function (err, contents) { 
     if (err) { 
      console.log('Error: ', err); 
     } else { 
      dbx.filesUpload({path: "/"+filename ,contents: contents }).then(function (response) { 
      // Once the file upload is done then send mail 
      console.log("done") 
      sendMail('xyz', user.email, 'Confirmation received', filename, path, function(err, result){ 
       // once mail is successful then delete the file finally 
       fs.unlinkSync(path); //if you need you can use callback with this for confirmation of deletion 
      }); 
      }).catch(function(err) { 
      console.log(err); 
      }); 
     } 
    }); 
    } 
}); 

function sendMail(sender, receiver, subject, filename, path, callback){ 
    var mailOptions = { 
    from: sender, // sender address 
    to: receiver, // list of receivers 
    subject: subject, // Subject line 
    attachments : [{ 
     filename: filename, 
     path : path 
    }] 
    }; 

    transporter.sendMail(mailOptions, (err, info) => { 
    if (error) { 
     callback(err, null); 
    } else { 
     console.log('Message %s sent: %s', info.messageId, info.response); 
     callback(null, info) 
    } 
    }); 
} 
} 
+0

파일을 삭제하려고 시도한 후에'Message sent [...]'가 발생한다는 것을 알 수 있습니까? –