节点计划作业无法正常运行

时间:2018-08-14 09:59:20

标签: node.js for-loop nodemailer

我正在尝试使用节点计划。我想创建一个动态调度程序。我想动态设置时间表规则。根据github上的文档调用它时,它的工作正常。但是,当我将其带入函数循环时,则无法正常工作。我的代码如下。为了安全起见,代码中的smtp电子邮件地址已被修改。

con.connect(function (err) {
    if (err) throw err;
    con.query("SELECT * FROM customers", function (err, result, fields) {
        if (err) throw err;
        for (var i = 0, len = result.length; i < len; i++) {
           var dt = dateTime.create(result[i].expire_date);
           var formattedDate = dt.format('Y-m-d');
           if (result[i].payment_status === 0) {
               var dt_str = formattedDate.split('-');
               var dt_year = parseInt(dt_str[0]);
               var dt_month = parseInt(dt_str[1]);
               var dt_date = parseInt(dt_str[2]);

               var mail_to = result[i].email, mail_sub='Schedule Of Maintenance', mail_message='Test Mail message Status';
               console.log('ScheduleCron Function calling');

               scheduleCron(dt_date,dt_month, dt_year, mail_to, mail_sub, mail_message);
           } else {
               console.log(result[i].payment_status);
           }
        }
    });
});

function scheduleCron(schedule_date,schedule_month,schedule_year,mail_to,mail_sub,mail_message) {

console.log(schedule_date+'  '+schedule_month+'  '+schedule_year);
console.log('ScheduleCron Function In');

var date = new Date(schedule_year, schedule_month, schedule_date, 13, 33, 0);
schedule.scheduleJob(date, function(){
    sendEmail( mail_to, mail_sub, mail_message);
    });
}


function sendEmail(mail_to,mail_sub,mail_message) {
   var mailOptions = {
      from: "email@gmail.com",
      to: mail_to,
      subject: mail_sub,
      text: mail_message

   };
   transporter.sendMail(mailOptions, function (error, info) {
       if (error) {
        throw error;
       } else {
        console.log("Email successfully sent!");
      }
   });
}

3 个答案:

答案 0 :(得分:0)

您需要创建一个工作对象,如文档https://www.npmjs.com/package/node-schedule

中所示
let initialText = rx.sentMessage(#selector(MyViewController.viewDidLoad)).map { _ in "" }
let name = Observable.merge(initialText, nameChangedProperty.asObservable())

答案 1 :(得分:0)

您缺少调度算法所需的Job对象。 从文档中

工作和计划​​

节点调度中的每个调度作业都由一个Job对象表示。您可以手动创建作业,然后执行schedule()方法应用时间表,或使用方便的函数scheduleJob(),如下所示。

答案 2 :(得分:0)

我也被这个弄糊涂了。我不明白为什么这不起作用,我的意思是“myFunc()”是一个函数。对?所以你把 myFunc() 放到 scheduleJob() 的第二个参数中:

function myFunc(){
    console.log("stuff");
    do.otherStuff();
}

schedule.scheduleJob('*/10 * * * *', myFunc());

但出于某种奇怪的原因,它必须这样调用:

function myFunc(){
    console.log("stuff");
    do.otherStuff();
}

schedule.scheduleJob('*/10 * * * *', function(){
    myFunc();
});

避免在执行时出现 TypeError: this.job.execute is not a function 错误。