保持节点js功能运行,而不使用前端的任何调用

时间:2016-02-19 14:05:55

标签: javascript node.js mongodb

我需要让我的NodeJs API继续在mongodb中创建随机数据。

我正避免从客户端调用它,因为这应该是完全在后端发生的事情。

var autoCreate = function(){
  var randomNumb = (Math.random()* (10-0) + 0).toFixed(0);
  var randomThing = randomstring.generate({
    length: randomNumb,
    charset: 'alphabetic'
  });

  Thing.create({
    name: randomThing,
    readByUser: false 
  }, function(err, thing) {
    if(err) { return handleError(res, err); }
  });

  setInterval(function() {
    autoCreate();
  }, randomNumb*1000);
}

但是我是如何以及在哪里第一次调用此函数。在我的Node API文件/控制器中,我不能只写autoCreate(),它会中断。

这样做的正确方法>

4 个答案:

答案 0 :(得分:2)

只要有活动计时器,您的脚本就会继续运行。

你的问题中的代码有一个小缺陷,因为每次调用函数本身时它都会调用setInterval,但函数本身永远不会被调用。 这意味着它没有启动,如果你要启动它,你将不断添加新的时间间隔直到进程,数据库进程或整个系统崩溃的程度。

使用setInterval

的示例
function ping() {
  console.log('ping');
}

setInterval(ping, Math.random() * 1000);

只需以随机间隔启动ping - 其中随机时间生成一次,并用作ping s之间的间隔

使用setTimeout的示例(这是您似乎想要的)

function ping() {
  clearTimeout(timer);
  console.log('ping');

  timer = setTimeout(ping, Math.random() * 1000);
}

//  ensure the timer variable exists in the global scope
var timer;
ping();

在这个例子中,你需要自己启动ping,并且它会随机间隔地调用自己。

答案 1 :(得分:0)

使用此功能注册自动创建电话

setTimeout(autoCreate, 1000);

这将每1秒注册一次对autoCreate功能的调用。

也可以在回调MongoClient.connect函数的最后一行调用autoCreate函数。

答案 2 :(得分:0)

您可以在声明后致电,无需客户互动。

constants

答案 3 :(得分:0)

在后端自动执行任务的最佳方法是使用cron作业。这是一个救援模块node-cron。这是一个例子 -

  var autoCreate = function(){
    var randomNumb = (Math.random()* (10-0) + 0).toFixed(0);
    var randomThing = randomstring.generate({
      length: randomNumb,
      charset: 'alphabetic'
    });

    Thing.create({
      name: randomThing,
      readByUser: false 
    }, function(err, thing) {
      if(err) { return handleError(res, err); }
    });
  }

var CronJob = require('cron').CronJob;
var job = new CronJob('00 30 11 * * 1-5', function() {
  autoCreate();
  /*
   * Runs every weekday (Monday through Friday)
   * at 11:30:00 AM. It does not run on Saturday
   * or Sunday.
   */
  }, function () {
    /* This function is executed when the job stops */
  },
  true, /* Start the job right now */
  timeZone /* Time zone of this job. */
);

您可以根据需要设置cron模式。