这是我的代码,我试图创建一个电子邮件调度程序
router.post(`/blogs`, async (req, res) => {
let mailTransporter = nodemailer.createTransport({
service: "gmail",
auth: {
user: process.env.GOOGLE_APP_EMAIL,
pass: process.env.GOOGLE_APP_PW
}
});
const data = {
to: `${req.body.to}`,
second: `${req.body.second}`,
minute: `${req.body.minute}`,
};
const task = cronJob.schedule(`*/${data.minute}`, () => {
mailTransporter.sendMail(data, err => {
});
})
task.stop();
});
每当我将时间设置为超过30秒时,就会得到
"Process timed out after 30 seconds"
从我部署的服务器上的日志中取出,这意味着我的响应被延迟到后端所以我问是否有一种方法,我可以设置一个加载器,以保持服务器旋转之前我的请求是作出,以避免得到一个30秒的错误
我建议更改的事情有很多,特别是将数据存储在当前运行进程以外的地方,但我会尽可能接近您的问题。
您超时了,因为您从未响应。与您正在使用的cron库无关。
你可以在express中增加超时,但这是一个非常糟糕的主意,除非你知道你在做什么,以及它会对其他进程产生什么影响。此外,为什么你要设置一个cron并等待它完成,这是没有意义的。
// you only need one instance of this mailer, create it outside your handler
let mailTransporter = nodemailer.createTransport({
service: "gmail",
auth: {
user: process.env.GOOGLE_APP_EMAIL,
pass: process.env.GOOGLE_APP_PW
}
});
router.post(`/blogs`, async (req, res) => {
// why the string literals?
const data = {
to: req.body.to,
second: req.body.second,
minute: req.body.minute,
};
// I would store these cronjobs in some sort of DB and have a separate
// process manage them, otherwise they will be lost on restart
const task = cronJob.schedule(`*/${data.minute}`, () => {
mailTransporter.sendMail(data, err => {
console.log(err)
});
})
// if you're using node-cron this will stop your task
// before it has even run, so I'm commenting this out
// task.stop();
res.send(); // respond to the client
});