我有一个函数以随机的时间间隔输入数据库。它使用随机超时递归调用自身。
但它当然会干扰请求/响应周期,这就是我希望它成为后台任务的原因。
如何在Node.js的后台运行function
?我遇到了npm模块kue
但是我不明白如何使用它来让这个函数在后台运行。
编辑:我创建了一个文件bgTask.js
并将此功能移到那里:
var randomstring = require('random-string');
var Thing = require('./thing.model');
var autoCreate = function(){
console.log("THING CREATED AUTOMATICALLY")
var randomNumb=0;
clearTimeout(randomNumb);
randomNumb = (Math.random()* (10-5) + 5).toFixed(0);
console.log("random number", randomNumb)
var randomThing =randomstring({
length: randomNumb,
numeric: false,
letters: true,
special: false
});
console.log("ranfom thing", randomThing)
Thing.create({
name: randomThing,
readByUser: false
}, function(err, thing) {
console.log("THING IS", thing)
setTimeout(autoCreate, randomNumb * 1000);
});
}
setTimeout(autoCreate, 10*1000);
看起来像上面那样。
在我的API控制器文件中,我有这行代码:
var myBgTask = require('child_process').fork('./bgTask.js');
但我收到的错误是:
Error: listen EADDRINUSE :: 5858
我该如何解决这个问题?
答案 0 :(得分:0)
您不应该将此作为后台任务。我有一个类似的过程,我定期监视服务器的状态并更新数据库。
在一个单独的文件中,我有一个类似的类:
export default class ServerManager {
constructor(mongoServer, maxRestartAttempts = 5, restartTime = 60000, pollInterval = 5000) {
...
this.pollInterval = pollInterval;
}
//...lots of other methods
startMonitor() {
console.log('Starting Server Monitor.');
var self = this;
this.intervalID = setInterval(self.monitorLoop.bind(this), self.pollInterval);
}
}
monitorLoop调用一系列方法,其中之一是:
checkServers() {
// check if any servers are down
for (var serverName in this.serversMap) {
var server = this.servers[this.serversMap[serverName]];
// todo improve handling of different states
if (server.state !== 'running' &&
server.shouldRestart &&
server.status === 'ACTIVE' &&
server.restartAttempts < this.maxRestartAttempts) {
var now = new Date();
if (now - server.restartTimeStamp > this.restartTime) {
var update = {
restartTimeStamp: now,
restartAttempts: server.restartAttempts + 1,
state: "restarting"
};
this.mongoServer.findById(server._id)
.then(saveUpdates(update))
.catch(handleError('Todo: Something bad happened here'));
this.restartServer(server);
} // end if (now - server.restartTimeStamp > this.restartTime)
} // end if (server.state !== 'running' && ...
} // end for (var serverName in this.serversMap)
} // end checkServer
回到我的server.controller.js我有:
import ServerManager from './ServerManager';
let serverManager = new ServerManager(Server);
...
console.log('starting monitor');
Server.find({}).then(servers => {
servers.forEach(server => {
serverManager.addServer(server)
})
})
.then(() => {
serverManager.startMonitor();
}
)
.catch((err) => console.log(err));
您可以在此处查看我的代码:https://github.com/MichaelLeeHobbs/roboMiner/tree/master/server/api/server
我意识到这并没有直接回答你的问题,因此如果你真的想把这个作为后台任务,我会删除我的答案。