首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Node.js中后台运行函数

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

Stack Overflow用户
提问于 2016-02-20 19:25:28
回答 1查看 1.4K关注 0票数 0

我有一个函数,可以在随机的时间间隔向数据库输入数据。它使用随机超时递归地调用自己。

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

如何在Node.js中后台运行function?我遇到了npm模块kue,但我一点也不懂如何使用它让这个函数在后台运行。

编辑:我创建了一个文件bgTask.js,并将这个函数移到了那里:

代码语言:javascript
运行
复制
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的控制器文件中,我有下面这行代码:

代码语言:javascript
运行
复制
var myBgTask = require('child_process').fork('./bgTask.js');

但是我得到了一个错误,它说:

代码语言:javascript
运行
复制
Error: listen EADDRINUSE ::  5858

我该如何解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2016-02-20 21:05:04

您不应该将此作为后台任务来执行。我有一个类似的过程,我定期监视服务器的状态并更新数据库。

在一个单独的文件中,我有一个类,如下所示:

代码语言:javascript
运行
复制
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调用一系列方法,其中之一是:

代码语言:javascript
运行
复制
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,我有:

代码语言:javascript
运行
复制
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

我意识到这不能直接回答你的问题,因此如果你真的想把它作为后台任务来做,我会删除我的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35522542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档