2017-04-13 2 views
-1

Ich versuche ein PDF sofort zu löschen, nachdem es in node.js generiert wurde. Das generierte PDF wird als E-Mail-Anhang gesendet, auf dropbox hochgeladen und dann aus dem lokalen Dateisystem gelöscht. Aber wenn ich versuche, es zu löschen, löscht es es nicht, und es sendet die E-Mail auch nicht. Die PDF wird mit erstellt. Hier ist mein Code:Nodejs Sofort generierte Datei löschen

 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 
} 

Also wenn ich das tue fs.unlink' or fs.unlinkSync`, wenn die Datei bereits vorhanden ist es funktioniert, aber die Dateien, die wie in Pfad erzeugt wird, nicht gelöscht.

+1

Sie müssen warten, bis Sie die E-Mail fertig zu senden. – SLaks

+0

console.log ist Ihr bester Freund hier, wenn Sie etwas anstelle von 'unlinkSync (Pfad)' drucken Sie werden feststellen, dass Ihre 'Nachricht gesendet' auftritt, nachdem Ihr Versuch, die Datei zu löschen –

Antwort

0

NodeJs ist asynchron, so dass Sie jeden Block richtig behandeln müssen. Ihr Code zeigt, dass einige Male vor dem vollständigen Erstellen der PDF-Datei der Dateiupload in Dropbox gestartet wird, wenn die PDF-Erstellung langsam ist.

Und das Löschen der PDF-Datei passiert vor dem Senden der E-Mail, so erhalten Sie einige Fehler, aber Sie haben Sie Fehler in fs.unlink() nicht protokolliert. Teilen Sie Ihren Code als Blöcke auf und verwenden Sie Callback für bessere Leistung und besseren Fluss.

Der Code sollte wie sein diese richtig zu arbeiten ..

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

funktionierte dies? –