我有一个模型,我想设置一个计时器,以便在创建模型实例后,timer
倒计时1小时。当timer
到期时,我希望能够执行脚本。有什么想法吗?
var mongoose = require ('mongoose');
var Schema = mongoose.Schema;
var mySchema = new Schema({
timer: {
type: Date,
expires: '1h'
}
});
修改
安迪在这里。我是赏金的创造者而不是原始的海报。我打开了这笔赏金,因为我还没有找到一种方法来自信地跟踪即将到期的文件。我使用mongoose-cron为每个用户创建的匹配创建作业。如果服务器没有问题(重新启动/崩溃/等),则cron作业将按时到期(24小时),并为相关文档设置过期属性false
。
问题是当服务器出现某种中断时。在这种情况下,cron作业被破坏或至少与我创建的闭包无关(在正确的文档中提供)。因此,我不认为cron工作是答案,我希望找到一种我可以信任的生产环境方法。
答案 0 :(得分:0)
这似乎是一个逻辑工作,而不是 Mongoose Schema 工作。 为什么在创建实例时不在服务器上执行脚本?
也许,没有保证,你可以用mongoose-cron npm模块按照自己的方式去做。你也可以看看mongoose-function看起来也很有趣。
你可以尝试存储函数的另一种可能性(有点像SQL存储过程),但显然不会像this回答中所说的那样鼓励这样做。
答案 1 :(得分:0)
请考虑以下解决方案。
一个单独的notifications
项目来处理所有timer
相关的功能。
Model
实例后,立即用数据注册一个cron
事件并将其存储在数据库中。notifications
模块检查数据库中即将发生的cron
事件,并在计时器中的数据过期后立即执行。维护timer
与模型创建无关,因此可以轻松维护重启服务器。
我有一个notifications github项目,可以注册cron事件并将其存储在数据库中,并在完成后执行。
在notifications
中,我是在cron完成后发送电子邮件的,您可以根据需要进行处理。
更改文件sendNotification
中的notifications/app/message.js
方法
messages.sendNotification = (data) => {
if(data.length === 0){
logger.info(`No notifications to send on ${moment().format("YYYY-MM-DD")}`);
return;
}
data.forEach(function (row) {
mailer.send({
subject:"Notifications Message",
to:row.recipient_email,
text:row.data
},updateNotificationStatus(row));
});
};
配置notifications
以根据需要从数据库中获取最新的cron事件。
Source file - /notifications/config/config.js
config.CRON_JOB_RULE = "0 11 * * *"; // daily at 11 am
对于cron注册,您必须使用json数据发出POST请求/notifications
。
POST请求示例
var data = {
"email":"",
"date":"",
"message":""
};
$.ajax({
url:"/notifications",
type: "POST",
contentType: "application/json; charset=utf-8",
dataType:"json",
data:JSON.stringify(data)
});