nodejs中的连续任务

时间:2014-06-01 17:37:07

标签: node.js express

我正在使用nodejs和express for webapp,我需要连续运行 一些代码检查一些数据是否发生变化,然后更新我的mongodb。

如何轻松创建一个与主要任务一起运行的后台进程?这样后台任务/进程就可以通知主要任务。

我已经尝试过了:

  • 使用" setInterval"解决此问题主要过程中的功能 - >我没有问题,但认为它不是一个好主意,因为它阻止节点事件循环
  • 使用子流程 - >我找不到关于它们的好教程 - >是否有一种更简单的方法,也许是一个可以帮助我的图书馆?
  • 一些后台工作者库 - >但是在子进程上执行重载任务并完成但我需要一直进行工作

更新

最终解决方案

UpdateEvent.js

var events = require('events');

function Updater(time) {
    this.time = time;
    this.array = [
        {number: 1},
        {number: 2}
    ];
    var that;
    events.EventEmitter.call(this);

    this.init = function()
    {
        that = this;
        console.log("Contructor");
        //Start interval
        setInterval(that.run,that.time);
    };

    this.run = function()
    {
        that.array.forEach(function (item) {
           if(item.number === 2)
           {
               that.emit('Event');
           }
        });
    };
}

Updater.prototype.__proto__ = events.EventEmitter.prototype;

module.exports = Updater;

然后使用它的代码:

server.js

var Updater = require('./UpdaterEvent');

var u = new Updater(10000);
u.init();
u.on('Event',function () {
   console.log("Event catched!");
});

我按照教程: http://www.sitepoint.com/nodejs-events-and-eventemitter/

2 个答案:

答案 0 :(得分:1)

问题在于导出Updater构造函数的方式:

exports.Updater = Updater;

如果需要,可以

var Updater = require('./UpdaterEvent');

然后尝试运行:

var u = new Updater(10000);

问题在于您不公开函数本身,而是公开包含该函数的名为Updater的属性的对象。因此,您必须使用

导出它
module.exports = Updater;

或者你必须使用:

var Updater = require('./UpdaterEvent').Updater;

无论哪种方式,然后调用new Updater()都可以。此时,您尝试通过调用对象而不是构造函数来初始化新对象,因此出现错误消息:

  

TypeError:object不是函数

答案 1 :(得分:0)

您应该查看Events and EventEmitter

你可以使用你不需要的子进程,因为JS是异步的。只需为后台进程创建一个函数,并将它传递给eventEmitter对象。您可以使用setInterval或while(true)循环来连续检查数据更改。当数据发生变化时,调用eventEmitter.emit(' someEvent');这将触发主任务中的一个功能来更新你的mongoDB。