2017-10-02 5 views
1

Ich bin auf der Suche nach einer Möglichkeit, die Abonnements unserer Benutzer mit einem Cron-Job täglich zu überprüfen. Ich möchte dafür node-cron verwenden. Ich bin mir nicht sicher, wo ich den Code setzen sollte, um den Cronjob zu starten. Derzeit habe ich es wie folgt ein:MEAN App Cron-Job mit Node-Cron bei App laden mit API-Aufruf

app.js:

app.listen(config.port, function() { 

      // Logging initialization 
      console.log('--'); 
      console.log(chalk.green(config.app.title)); 
      console.log(chalk.green('Environment:\t\t\t' + process.env.NODE_ENV)); 
      console.log(chalk.green('Port:\t\t\t\t' + config.port)); 
      console.log(chalk.green('Database:\t\t\t\t' + config.db.uri)); 
      if (process.env.NODE_ENV === 'secure') { 
       console.log(chalk.green('HTTPs:\t\t\t\ton')); 
      } 
      console.log('--'); 

      if (callback) callback(app, db, config); 

      var job1 = new cron.CronJob({ 
       cronTime: '* * * * *', 
       onTick: function(){ 
        app.get('/api/users/checkSubscriptions/').success(function() { 
         console.log('working!') 
        }).error(function() { 
         console.log('error!') 
        }); 
       }, 
       start: false, 
       timeZone: 'Europe/Paris'}); 
      job1.start(); 
     }); 

users.server.routes.js

'use strict'; 

module.exports = function(app) { 

    app.route('/api/users/checkSubscriptions/') 
     .get(subscriptionCheck.checkSubscriptions); 
}; 

Cronjob-subscription.server. Steuerung

var mongoose = require('mongoose'), 
User = mongoose.model('User'); 
exports.checkSubscriptions = function() { 
    User.findAll(function(err, users) { 
    if(err) { 
     console.log(err); 
    } else { 
     for(var i = 0;i< users.length; i++) { 
     var user = users[i]; 
     console.log(user); 
     } 
    } 
    }); 
} 

Derzeit möchte ich nur die Benutzer auf der Konsole drucken, um zu überprüfen, ob dies funktioniert. Mit dem aktuellen Code in app.js ich die folgende Fehlermeldung erhalten:

app.get('/api/users/checkSubscriptions/').success(function() { 
          ^

    TypeError: app.get is not a function 

Könnten Sie bitte beraten, wie ich den API-Aufruf in der cronjob tun kann, wenn die App Initialisierung?

+0

scheint in Ordnung außerhalb des 'app.listen' zu arbeiten. Ich denke, das macht Sinn, wenn versucht wird, 'app.get' zu initialisieren, bevor' app.listen' beendet ist. Ich bin mir auch nicht so sicher, wie lebensfähig Knoten-Cron und ein Express-Server zur gleichen Zeit ausgeführt wird. – TomFirth

+0

@TomFirth beim Platzieren des Codes außerhalb der app.listen ich immer noch die gleiche Fehlermeldung (app.get ist keine Funktion ..). Wie würden Sie vorschlagen, dass ich dies ohne den Knoten-Cronm implementieren, aber innerhalb Express dann? –

Antwort

0

Ich habe es geschafft, indem es den Code in meiner server.js-Datei anstelle der app.js-Datei hinzugefügt. In dem server.js habe ich folgenden (relevant) -Code jetzt:

var app = require('./config/lib/app'), 
cron = require('cron'); 

var server = app.start(function(req, res) { 
var job1 = new cron.CronJob({ 
    cronTime: '00 30 07 * * 1-7', 
    onTick: function() { 
     //function execution 
    }, 
    start: false, 
    timeZone: 'Europe/Paris' 
}); 
job1.start();