2017-04-13 17 views
-1

node.jsにisが生成された直後にpdfを削除しようとしています。生成されたpdfは電子メールの添付ファイルとして送信され、dropboxにアップロードされ、ローカルファイルシステムから削除されます。しかし、私はそれを削除しようとすると、それは削除されませんし、どちらかの電子メールを送信しません。 pdfはhtml-pdfを使用して作成されます。ここに私のコードは次のとおりです。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 
} 

だから私はfs.unlink' or fs.unlinkSync`を行う際に、ファイルが既にある、それは動作しますが、パスのように生成されたファイルは削除されません場合。

+1

あなたは電子メールを送信完了するまで待つ必要があります。 – SLaks

+0

console.logはあなたの親友です。もしあなたが 'unlinkSync(path)'の代わりに何かを印刷すると、ファイルを削除しようとした後に 'Message sent [...]'が出ることに気づくでしょう。 –

答えて

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

これはうまくいきましたか? –

関連する問題