如何在node js中延迟请求

xxhby3vn  于 2023-04-05  发布在  Node.js
关注(0)|答案(1)|浏览(140)

这是我的代码我试图创建一个电子邮件调度

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秒的错误

oprakyz7

oprakyz71#

我建议改变很多东西,特别是将数据存储在当前运行进程之外的其他地方,但我会尽可能接近您的问题。
你超时是因为你从来没有响应过。这与你使用的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

});

相关问题