如何在nodejs中获得每天通过的日期?



我打算做的是一个程序,它向几个用户发送生日祝贺电子邮件,然后该程序将在今天执行对数据库(它是一个Excel文件)的查询,其中它将获取用户的日期并将其出生日期与当前日期进行比较,如果月份和日期一致,将发送邮件。我认为这可以用setInterval()来完成,但我不知道它是否会影响程序的性能。因为要上传到我公司的windows server 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 package cron-job每小时运行一次cron作业使用

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

我将把我的答案分成两部分

  1. 要使解决方案工作,您需要做些什么
  2. 如何优化性能

1。您需要做什么才能使您的解决方案工作

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

。您的解决方案将按原样工作,唯一需要做的就是在启动服务器后调用/send-emailendpoint。但是…这是有副作用的。因为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等)来存储您的数据,并仅查询与生日匹配的特定日期的条目。我还将实现一个排队系统来分批处理查询和发送电子邮件,而不是一次完成所有这些。

最新更新