2016-02-20 20 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

我意識到這並不直接回答你的問題,因此我會刪除我的答案,如果你真的想這樣做的背景任務。