Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js/Koa2服务器-在请求后几分钟执行作业_Javascript_Node.js_Koa_Koa2 - Fatal编程技术网

Javascript Node.js/Koa2服务器-在请求后几分钟执行作业

Javascript Node.js/Koa2服务器-在请求后几分钟执行作业,javascript,node.js,koa,koa2,Javascript,Node.js,Koa,Koa2,我有一个Koa2/Node.js应用程序(使用async/await),我想在请求后X分钟执行一个作业,其中X是20-100分钟的随机数(我想用它向注册用户发送自动欢迎电子邮件,让它看起来像是我亲自发送的) 因此,我可以使用setTimeout来完成这项工作吗?将计时器设置为200分钟是否合理?当然,如果我的应用程序崩溃,电子邮件将不会发送,但我将跟踪数据库中的所有注册,因此在罕见的崩溃情况下,我将自己发送电子邮件。命令队列,如rabbitMQ或环绕Redis(使用pub/sub或SETEX)对

我有一个Koa2/Node.js应用程序(使用
async/await
),我想在请求后X分钟执行一个作业,其中X是20-100分钟的随机数(我想用它向注册用户发送自动欢迎电子邮件,让它看起来像是我亲自发送的)


因此,我可以使用
setTimeout
来完成这项工作吗?将计时器设置为200分钟是否合理?当然,如果我的应用程序崩溃,电子邮件将不会发送,但我将跟踪数据库中的所有注册,因此在罕见的崩溃情况下,我将自己发送电子邮件。

命令队列,如rabbitMQ或环绕Redis(使用pub/sub或
SETEX
)对于这样简单的任务来说似乎是一项开销

对于可能有N个请求的相对较长时间的超时,确实感觉有点不舒服,但是Node.js
setTimout()
实际上是
libuv
uv\u timer
函数的包装器,该函数旨在通过底层操作系统通知机制处理大量计时器

不过,为了使事情尽可能简单,我会使用一个好的旧cron作业和一些包装器库,其中隐藏了确切的实现。使用类似的东西,只需几行代码就可以完成

const schedule = require('node-schedule');

const getRandomMsAmount = (from, to) => {
  const minutes = Math.floor(Math.random() * to) + from;
  return minutes * 60 * 1000;
};

const getDateAfterMs = (ms) => {
  const nowTimestamp = Number(new Date());
  return new Date(nowTimestamp + ms);
};

const dueDate = getDateAfterMs(getRandomMsAmount(20, 100));
const emailJob = schedule.scheduleJob(dueDate, () => {
  // logging, updating database, etc.
});
如果处理过程中出现问题,可以取消引用的作业:

emailJob.cancel();

我希望您的电子邮件也包含随机内容,因为即使是单个用户,在不同的注册尝试情况下也可以收到多封邮件,因此这种延迟可能会成为一种烦人的体验。

为什么不使用SendGrid并创建模板,使电子邮件过程自动化,并立即发送电子邮件。比等待100分钟使用您刚刚注册的新站点更好的用户体验。实际上我使用SendGrid,电子邮件过程是自动化的,我只是想自动化延迟。并让它看起来像是由人而不是机器人发送的。如果可以的话,chron作业会比setTimeout好。你应该授权发送电子邮件,并在请求之外工作。在数据库中设置标志并使用cron作业?或者使用更奇特的工具(redis pub/sub、rabbitMQ队列和使用脚本处理消息?@MaciejKrawczyk):您能分享一下您最终是如何解决问题的吗?