我正在使用nodejs和express for webapp,我需要连续运行 一些代码检查一些数据是否发生变化,然后更新我的mongodb。
如何轻松创建一个与主要任务一起运行的后台进程?这样后台任务/进程就可以通知主要任务。
我已经尝试过了:
更新
最终解决方案:
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/
答案 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)
你可以使用你不需要的子进程,因为JS是异步的。只需为后台进程创建一个函数,并将它传递给eventEmitter对象。您可以使用setInterval或while(true)循环来连续检查数据更改。当数据发生变化时,调用eventEmitter.emit(' someEvent');这将触发主任务中的一个功能来更新你的mongoDB。