2017-05-27 5 views
0

Ich versuche, einen Zeitplan Job mit Heroku machen.Zeitplan Job-Knoten js mit Heroku

habe ich cron npm der Grund, warum

#!/usr/bin/env node 
var mongoose = require('mongoose'); 
var nodemailer = require('nodemailer'); 
var myNoti = require('./models/notificationSchema'); 
var mongoose = require('mongoose'); 
var CronJob = require('cron').CronJob; 
config = { 
    mongoUrl:'mongodb://<myuser>:<mypass>@XXXX.mlab.com:XXXX/XXX' 
}; 


new CronJob('38 00 * * *', function() { 
    console.log('You will see this message every second'); 
function sendMail() 
{ 
    //The server option auto_reconnect is defaulted to true 
var options = { 
    server: { 
    auto_reconnect:true, 
    } 
}; 
mongoose.Promise = global.Promise; 
mongoose.connect(config.mongoUrl, options); 
db = mongoose.connection;// a global connection variable 
// Event handlers for Mongoose 
db.on('error', function (err) { 
    console.log('Mongoose: Error: ' + err); 
}); 

db.on('open', function() { 
    console.log('Mongoose: Connection established'); 
}); 

db.on('disconnected', function() { 
    console.log('Mongoose: Connection stopped, recconect'); 
    mongoose.connect(config.mongoUrl, options); 
}); 

db.on('reconnected', function() { 
    console.info('Mongoose reconnected!'); 
}); 

    var email,Recommendation; 
    var today = new Date(); 
    var dd = today.getDate(); 
    var mm = today.getMonth()+1; //January is 0! 
    var yyyy = today.getFullYear(); 

    if(dd<10) { 
    dd='0'+dd 
    } 
    if(mm<10) { 
    mm='0'+mm 
    } 
    var mytoday = dd+'/'+mm+'/'+yyyy; 
    console.log(mytoday); 

    myNoti.find({},function(err, docs){ 
    console.log('in the find function'); 
    for(var i=0; i<docs.length; i++) 
    { 
     email = docs[i].email; 
     recommendation = docs[i].Recommendation; 
     var tempDate = new Date(docs[i].dateNoti); 
     dd = tempDate.getDate(); 
     mm = tempDate.getMonth()+1; //January is 0! 
     yyyy = tempDate.getFullYear(); 
     if(dd<10) { 
     dd='0'+dd 
     } 
     if(mm<10) { 
     mm='0'+mm 
     } 
     tempDate = dd+'/'+mm+'/'+yyyy; 

     if(mytoday === tempDate) 
     { 
     console.log("i'm in the if!"); 
     console.log("docs[i].repeat " +docs[i].repeat); 
     today.setDate(today.getDate() + Number(docs[i].repeat)); 
     newupdate = new Date(today); 
     myNoti.update({email: email,Recommendation: recommendation},{dateNoti: newupdate}, 
      function(err, num) { 
      if(err) 
       console.log(err); 
      else 
       console.log("updated"+num); 
     }); 

     sendit(email, recommendation) 
     } 
    } 

    }); 
} 

function sendit(email, recommendation) 
{ 
var transporter = nodemailer.createTransport({ 
    host: 'smtp.gmail.com', 
    port: 465, 
    secure: true, // use SSL 
    auth: { 
     user: '[email protected]', 
     pass: 'xxxxxx' 
    } 
}); 

// setup e-mail data 
var mailOptions = { 
    from: '"MY MEDICAL " <[email protected]>', // sender address (who sends) 
    to: email, // receiver 
    subject: 'Notification', // Subject line 
    text: '', // plaintext body 
    html: recommendation 
}; 

// send mail with defined transport object 
transporter.sendMail(mailOptions, function(error, info){ 
    if(error){ 
     return console.log(error); 
    } 

    console.log('Message sent: ' + info.response); 
}); 

} 
sendMail(); 
}, null, true, 'America/Los_Angeles'); 

dieser Code auf meinem localhost funktioniert, ich meine, wenn ich meinen Server nur laufen (ohne diese bestimmte Datei ausgeführt wird) es funktioniert - ich meine Datei alle Heroku hochgeladen aber Dieser Cron funktioniert nicht, ich bekomme meine E-Mails nicht ...

was soll ich tun?

Antwort

0
  1. Setzen Sie Ihre Funktion in eine öffentliche URL.

  2. Fügen Sie das Temporize Scheduler-Add-on auf Heroku hinzu, um Cron-Jobs auszuführen. (periodische api Anrufe).

  3. Konfigurieren Sie Temporize, um Ihre URL zum Senden von E-Mails aufzurufen, und wie oft Sie einen Tag pro Tag überprüfen möchten, z. B. jeden Tag um 13:00 Uhr. (Verwenden Sie Cron-Job sintax)

  4. Wenn Sie es privat machen möchten, generieren Sie ein Anmelde-Token von Temporize und überprüfen Sie dieses Token in Ihrer Funktion.