NodeJS 通过电子邮件发送文件后,如何删除该文件?

fafcakar  于 2022-12-22  发布在  Node.js
关注(0)|答案(2)|浏览(132)

现在我与 NodeJS 使用PDFKit生成PDF文件,我想删除后,通过电子邮件发送的文件使用Nodemailer,这里是我的代码:

reportcontroller.sendrecordsemail = async (req,res)=>{
    try{
        const doc = new PDF({
            bufferPages: true,
            compress: false,
            margins: {top: 20, left: 10, right: 10, bottom: 20}});
             
        const filename = `Report-${datehelper.dateformatlarge(Date.now())}.pdf`;
        const stream = res.writeHead(200, {
            'Content-Type': 'application/pdf',
            'Content-Disposition': `attachment; filename=${filename}`
        });
        const records = await queryaux.showrecords();
        let count = 1;
        const arecords = records[0].map((record) =>{
            arecord ={
                Name: record.Name,
                RecordType: record.RecordType,
                RecordDate: datehelper.dateformatshort(record.RecordDate),
                EntryTime: record.EntryTime,
                ExitTime: record.ExitTime,
                TotalHours: record.TotalHours
            }
            count++;
            return arecord;
        })
        doc.setDocumentHeader({...
        })
        doc.addTable([...
        })
        doc.render();
        const writestream = fs.createWriteStream(`Node/src/download/${filename}`);
        doc.pipe(writestream);
        const transporter = nodemailer.createTransport({
            host: "smtp.gmail.com",
            port: 465,
            secure: true,
            auth: {
              user: '-----',
              pass: '-----', 
            },
        });
        const mailOptions = {
            from: "----",
            to:"----",
            subject:"Test",
            text:"Test",
            attachments:[
                {
                    filename: `${filename}`,
                    path:`Node/src/download/${filename}`
                }
            ]
        }
        transporter.sendMail(mailOptions, (error, info) => {
            if(error){
                res.status(500).send({Error: error})
            }
            else{
                console.log('Mail sent successfully!');
            }
        });
        doc.on('data',(data)=>{stream.write(data)});
        doc.on('end',()=>{stream.end()});
        doc.end();
        fs.unlink(`Node/src/download/${filename}`,function(err){
            if(err){
                throw err;
            }else{
                console.log('Successfully deleted the file');
            }
        })
    }
    catch(error){
        console.log({Error: error})
    }
}

这是我在控制台上看到的:

Successfully deleted the file
Mail sent successfully!

当我检查我的电子邮件时,文件就在那里,所以Nodemailer正在工作,但是,即使我使用fs.unlink()删除了文件,该文件仍然在文件夹中。如果我再次请求请愿书,我得到了下一个错误:

Error: ENOENT: no such file or directory, open 'Node/src/download/Report.pdf'

有人知道我做错了什么吗?或者我有什么办法可以弥补?
我将非常感激,谢谢。

0sgqnhkj

0sgqnhkj1#

您可以在文档处理完成后删除pdf文件。

doc.on('end', () => {
  fs.unlink(filePath, err => {
    next(err)
  });
});
gjmwrych

gjmwrych2#

创建单独的函数发送电子邮件,将回调函数作为参数,当您的sendMail() {这是一个函数的nodemailer包在javascript函数将返回,你可以调用自己的回调删除文件,你会得到更好的想法与下图:
在此图像中,您可以了解如何使用回调参数声明自定义sendMail函数:

你可以这样称呼它:

相关问题