2016-02-20 17 views
0

我有一个函数可以随机的时间间隔向数据库中写入数据。它使用随机超时递归调用自身。如何在Node.js中在后台运行函数

但它目前当然会干扰请求/响应周期,这就是为什么我希望它成为后台任务。

如何在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

您看到什么类型的干扰请求? –

+1

你可以使用['child_process'](https://nodejs.org/api/child_process.html)。 'child_process.fork()'允许你异步执行.js文件。 – Shanoor

+0

@DavinTryon:我在帖子上发生连接错误,并把请求放在客户端/结束。 –

回答

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

我意识到这并不直接回答你的问题,因此我会删除我的答案,如果你真的想这样做的背景任务。