Node.js到Node.js的通信

时间:2012-06-04 06:35:06

标签: javascript node.js

如何使用从其他Node进程从其他Node进程加载的模块。

示例I运行:

node my_modules

加载MyModule

然后我将运行另一个nodejs进程:

node grab_modules

将运行GrabModule

GrabModule会尝试使用MyModule

中的功能

这可能吗?如果可能的话怎么办?

5 个答案:

答案 0 :(得分:7)

你想要的可能是dnode

来自README of dnode

服务器(托管要运行的功能):

var dnode = require('dnode');

var server = dnode({
    zing : function (n, cb) { cb(n * 100) }
});
server.listen(5050);

客户端(调用服务器上的函数并在回调中获取结果)

var dnode = require('dnode');

dnode.connect(5050, function (remote) {
    remote.zing(66, function (n) {
        console.log('n = ' + n);
    });
});

答案 1 :(得分:0)

这取决于你想要做什么。

如果您只想从两个单独的节点进程重用相同的模块(MyModule),那就非常容易了。您只需要在GrabModule中放置require('MyModule'),并在运行grab_module时访问MyModule。

如果你想在两个进程中“共享”MyModule及其全局变量,那就复杂得多。您需要在两个进程(通常是REST over socket)之间定义进程间协议,并使用该协议在另一个进程的一个进程中访问该模块。

答案 2 :(得分:0)

1)要在不同的流程中使用模块(实现)而不是实例(使用require在某处加载模块的模块),您只需要在任何需要的地方都需要该模块。

如果你运行两个流程,例如,流程A使用' MyModule'使用' GrabModule'的流程B,但您只需要' GrabModule',在流程B中,可以访问' MyModule'的导出属性。那么你只需要使用require(' MyModule'的路径)。

2)另一方面,如果你需要一个进程B,可以访问进程A的模块状态(已执行的模块,因为你在某处使用require),那么你需要使用IPC(进程间通信),允许在进程A和进程B之间交换数据,并在其上构建或使用相同的协议。

取决于您的进程是在同一台机器上还是在不同的机器上,可以在同一操作系统中使用某些IPC构建,如nodejs提供子分支(http://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options)或使用内置于某些网络通道的IPC

例如,您可以使用Redis的发布/订阅消息系统(http://redis.io/topics/pubsub

答案 3 :(得分:0)

这个怎么样:

my_modules将作为具有公共API的程序(rest api,xml-rpc,...) 和grab_modules将连接到api并调用my_modules

中的函数

答案 4 :(得分:0)

如果您还需要与其他语言和/或高速互操作,ZeroMQ也是一种选择。虽然最初是一个普通的C库,但我对NodeJS绑定有很好的经验。

几乎所有流行语言都有ZeroMQ绑定,请参阅http://zeromq.org/bindings:_start