如何在 nodejs 中每次一天过去时获取日期?

How to get the date every time a day passes in nodejs?

我打算做的是一个程序,向几个用户发送祝贺他们生日的电子邮件,然后该程序将在今天对数据库(它是一个 Excel 文件)执行查询,在它将获取用户的日期并将他们的出生日期与当前日期进行比较,如果月份和日期一致,将发送邮件。我觉得用一个setInterval()就可以了,但是不知道会不会影响程序的性能。因为要上传到我公司的windows服务器2012服务器

我的代码:

const express = require("express");
const app = express();
const excel = require('./public/scripts/readExcel.js');
const email = require('./services/email/sendEmail.js');
     
app.post('/send-email',(req, res)=>{
  setInterval(() => {
    email.sendEmail()
    .then((result) => {
        res.status(200).jsonp(req.body);;
        console.log(result)
    }).catch((err) => {
        res.status(500).jsonp(req.body);;
        console.log(err);
    });
  }, 3600000);//1 hour
    
});
app.listen(4000, ()=>{
    console.log("Serven on -> http://localhost:4000");
})

基本上它所做的是每小时调用 sendEmail 函数读取 Excel 文件或数据库并提取日期字段,与当天进行比较,并使用 Nodemailer 发送邮件给过生日的人。此外,setInterval 将进入“/send-email”的路径,或者将如何发出请求?

为此,您还可以 运行 使用 npm 包 cron-job 每小时执行一次 cron 作业 使用

var cron = require('node-cron');

cron.schedule('* * 1 * *', () => {
  console.log('running a task every hour');
});

我会将我的回答分为两部分

  1. 您需要做什么才能使您的解决方案有效
  2. 如何优化性能

1.您需要做些什么才能让您的解决方案发挥作用

您需要解决两个基本问题。

一个。您的解决方案将按原样运行,您唯一需要做的就是在启动服务器后调用 /send-email 端点一次。 但是... 这有副作用。 由于 setInterval 将每小时调用 email.sendEmail... 代码块,而此代码块每次都会调用 res.status(200).jsonp(req.body)。如果您不知道此 res.status.. 设置您收到的请求的响应。在这种情况下,您的请求 /send-email。这是第一次,它会正常工作,因为您正在返回对上述请求的响应。但是当第二次调用这个代码块时,它没有什么可响应的,因为请求已经被响应了。请记住,HTTP 协议响应一次请求,然后请求就完成了。因此,由于这个原因,您的代码块 res.status... 变得无效。所以首先,只调用 res.status 一次。所以我将从 setInterval 代码块中删除这一行,如下所示

app.post('/send-email',(req, res)=>{
  setInterval(() => {
    email.sendEmail()
    .then((result) => {
        console.log(result)
    }).catch((err) => {
        console.log(err);
    });
  }, 3600000);//1 hour
  res.status(200).jsonp(req.body);
})

b。此外,我认为您不希望每次启动服务器时都匆忙调用 /send-email,因此我还要确保每次自动启动服务器时都会启动这个生日祝福代码块。所以我会删除行 app.post('/send-email',(req, res)=>{。也不是说我不是为了请求而调用它,我没有任何发送响应的请求,所以我也可以删除 res.status.. 行。你的代码现在看起来像这样

const express = require("express");
const app = express();
const email = require('./services/email/sendEmail.js');

(function(){ 
  // Birthday wish email functionality
  setInterval(() => {
    email.sendEmail()
    .then((result) => {
        console.log(result)
    }).catch((err) => {
        console.log(err);
    });
  }, 3600000);//1 hour
})() // Immediately invoked function
    

就是这样,您的解决方案现在可以使用了。现在要发送生日祝福电子邮件,除了启动服务器外,您不需要做任何其他事情。


我们现在进入第二部分

2。如何优化性能

一个。将间隔设置为 24 小时而不是 1 小时

为什么生日要每小时检查一次?如果你在这里没有一个好的答案,我肯定会把间隔改成24小时

b。使代码更健壮以处理大数据

只要您的 excel 中只有 100 个条目,并且它们将来不会增长太多,我就不会为了性能而使其变得更复杂。 但是,如果您的条目注定要增长到 1000 甚至更多。我建议使用数据库(例如 mongodb、postgres 或 mysql 等)来存储您的数据,并仅查询生日与特定日期匹配的条目。 我还会实现一个排队系统来处理查询和批量发送电子邮件,而不是一次完成所有这些。