我需要让我的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()
,它会中断。
这样做的正确方法>
答案 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模式。