gpt4 book ai didi

javascript - Node js优化回调函数和nodemailer?

转载 作者:行者123 更新时间:2023-12-02 23:09:25 26 4
gpt4 key购买 nike

我正在尝试编写一个发布请求,该请求下载 route 提到的 URL 的 HTML 页面,然后将它们压缩并邮寄到 route 提到的电子邮件。该路线看起来像 http://localhost:3000/?urls=website1,website2&email=someemail 。我面临的问题是编写 promise ,因为我的代码在下载 HTML 文件之前开始压缩文件夹,然后通过电子邮件发送没有附件。然后我尝试了不同的 promise ,catch 和 async,await 但没有帮助。感谢您的帮助,谢谢


const getGoogleIndexHTML = (url) => {
return new Promise((resolve, reject) => {
request(url, (err, res, body) => err ? reject(err) : resolve(body))
})
}

const printAndWriteGoogleIndex = async (url) => {
try {
const a = url.split(".")
let googleIndexHTML = await getGoogleIndexHTML(url)
await fs.writeFile(directory + '/' + a[1] + '.html', googleIndexHTML, (err) =>{if(err) throw err})
console.log('File created.')
proccessed++;
} catch (err) {
console.log(err)
}
}

const saveZip = () => {
zipper.zip("./websites", function (error, zipped) {
if (!error) {
zipped.compress();
zipped.save("./package.zip", function (error) {
if (!error) {
console.log("Saved successfully !");
}
});
} else {
console.log(error)
}
})
}

app.post('/?', (req, res) => {
var urls = req.query.urls
var email = req.query.email;
var collection_urls = urls.split(",");
collection_urls.forEach(function (url) {
printAndWriteGoogleIndex(url)
});
saveZip();
const mailOptions = {
from: 'dhruvdesmond@gmail.com',
to: 'dhruvdesmond@gmail.com',
subject: 'Websites Zip file',
text: 'Please find zip attached below.',
attachment: [{
path: './package.zip'
}]
};
transporter.sendMail(mailOptions, function (err) {
if (err) {
return res.status(500).send({
msg: err.message
});
} else {
console.log("Mail sent")
}
})
});

最佳答案

您的问题出在这个代码段中,您在其中触发多个异步调用而不等待它们完成:

collection_urls.forEach(function (url) {
printAndWriteGoogleIndex(url)
});

在这里,您应该考虑使用 for..of 循环或传统的 for 循环和 ,而不是使用 forEach() 来迭代数组。在 printAndWriteGoogleIndex 调用上等待:

app.post('/?', async (req, res) => {
var urls = req.query.urls
var email = req.query.email;
var collection_urls = urls.split(",");
for(url of collection_urls){
await printAndWriteGoogleIndex(url); //wait for the printAndWriteGoogleIndex to complete
});
saveZip();
...
}

您需要等待各个文件被写入,当所有文件都写入后,您可以立即压缩它,为此,您需要 await 返回的隐式 promise printAndWriteGoogleIndex 函数,会返回一个隐式 promise ,因为该函数是一个 async 函数。

为了让单个 await 在移至下一个之前完成,您需要使用 for..of 循环,而不是 forEach( ),您可以在这篇优秀的 answer 中阅读更多相关信息。作者:贝尔吉。

关于javascript - Node js优化回调函数和nodemailer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57441844/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com