5

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

我运行的示例:

node my_modules

哪个负载MyModule

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

node grab_modules

这将运行GrabModule

GrabModule将尝试使用里面的函数MyModule

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

4

5 回答 5

7

你想要的可能是dnode

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);
    });
});
于 2012-06-04T10:21:26.203 回答
0

这取决于你想要做什么。

如果您只是想从两个单独的节点进程重用相同的模块(MyModule),那很容易。您只需将 require('MyModule') 放在 GrabModule 中,并且在运行 grab_module 时可以访问 MyModule。

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

于 2012-11-14T05:33:36.277 回答
0

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

如果您运行两个进程,例如,使用“MyModule”的进程 A 和使用“GrabModule”的进程 B,但您只需要进程 B 中的“GrabModule”可以访问“MyModule”的导出属性,那么您只需要使用 require('path to MyModule')。

2)另一方面,如果您需要进程B,可以访问进程A的模块状态(已执行的模块,因为您在某处使用了require),那么您需要使用IPC(Inter - 进程通信)允许在进程 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

于 2013-05-14T13:49:47.980 回答
0

那这个呢:

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

于 2013-12-26T15:30:54.090 回答
0

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

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

于 2014-01-12T17:56:42.893 回答