Javascript 是否可以在node.js中组合回调和事件

Javascript 是否可以在node.js中组合回调和事件,javascript,node.js,mongodb,child-process,Javascript,Node.js,Mongodb,Child Process,我希望将MongoDB数据库作为一个child_进程运行,因为某些数据库操作需要花费大量时间,我不希望应用程序的其余部分冻结 我能够将数据库代码放入一个模块中,该模块通过child_进程中的事件发射器进行反应和响应 以下是简化版本(db process.js)中的代码: 挑战在于,我希望能够通过传递回调函数来使用数据库模块。这将使它更容易在我的所有其他模块中使用。但是如何将事件中的变量放入回调函数中呢?这可能吗 下面显示了我在简化版本(db controller.js)中未完成的尝试: 所以我希

我希望将MongoDB数据库作为一个child_进程运行,因为某些数据库操作需要花费大量时间,我不希望应用程序的其余部分冻结

我能够将数据库代码放入一个模块中,该模块通过child_进程中的事件发射器进行反应和响应

以下是简化版本(db process.js)中的代码:

挑战在于,我希望能够通过传递回调函数来使用数据库模块。这将使它更容易在我的所有其他模块中使用。但是如何将事件中的变量放入回调函数中呢?这可能吗

下面显示了我在简化版本(db controller.js)中未完成的尝试:

所以我希望能够像这样使用这个模块:

var dbController = require('./db-controller.js');

dbController.getRecord(function(record)){
    // Do something with record...
});

关于如何实现这一点有什么想法吗?

据我所知,您不能在节点实例(主实例和分叉实例)之间传递回调,但可以传递数据

在您的案例中,您将使用worker pool模块,workers实例将在其中处理所有db查询,master(池实例)将向这些worker发送数据,并在完成查询时收集结果


这是我在github上做过的一个,但在npm上还有一些其他选择。

另一个选择是完全解耦流程。我以前在Amazon上使用过SQS,我将数据放入队列中,还有另一个服务器/进程侦听、唤醒并处理这些项目。这是一个非常简单的模型。如果不在AWS上,您可能会使用rabbitmq之类的东西。这样,您的应用程序服务器就不会被阻塞,因为它只是将数据转储到队列并继续

var childProcess = require('child_process');
var dbProcess = childProcess.fork('./db-process.js');

dbProcess.on('message', function(msg) {
    switch(msg.name){
        case 'getRecord':
            var record = msg.record;
            break;
        case 'saveRecord':
            // Handling here...
            break;
    }
});    

var controller = {};    

controller.getRecord = function(onQueryDone){
    dbProcess.send({name: 'getRecord'});
    // How to call the callback function with data when it is received? Basicly want the record variable from the switch.
    onQueryDone(record);
};

controller.saveRecord = function(record, onQueryDone){
    dbProcess.send({name: 'saveRecord'});
    // Handling...
};

module.exports = controller;
var dbController = require('./db-controller.js');

dbController.getRecord(function(record)){
    // Do something with record...
});