当Mongoose计时器到期时执行脚本

时间:2017-01-02 17:29:44

标签: node.js mongoose timer

我有一个模型,我想设置一个计时器,以便在创建模型实例后,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工作是答案,我希望找到一种我可以信任的生产环境方法。

2 个答案:

答案 0 :(得分:0)

这似乎是一个逻辑工作,而不是 Mongoose Schema 工作。 为什么在创建实例时不在服务器上执行脚本?

也许,没有保证,你可以用mongoose-cron npm模块按照自己的方式去做。你也可以看看mongoose-function看起来也很有趣。

你可以尝试存储函数的另一种可能性(有点像SQL存储过程),但显然不会像this回答中所说的那样鼓励这样做。

答案 1 :(得分:0)

请考虑以下解决方案。

一个单独的notifications项目来处理所有timer相关的功能。

  1. 创建Model实例后,立即用数据注册一个cron事件并将其存储在数据库中。
  2. 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)
        });