如何在Node.js中在后台运行函数

时间:2016-02-20 11:25:28

标签: 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

我该如何解决这个问题?

1 个答案:

答案 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

我意识到这并没有直接回答你的问题,因此如果你真的想把这个作为后台任务,我会删除我的答案。