如何使用从另一个 Node 进程加载的其他 Node 进程的模块。
我运行的示例:
node my_modules
哪个负载MyModule
然后我将运行另一个 nodejs 进程:
node grab_modules
这将运行GrabModule
GrabModule
将尝试使用里面的函数MyModule
这可能吗?如果这可能怎么办?
如何使用从另一个 Node 进程加载的其他 Node 进程的模块。
我运行的示例:
node my_modules
哪个负载MyModule
然后我将运行另一个 nodejs 进程:
node grab_modules
这将运行GrabModule
GrabModule
将尝试使用里面的函数MyModule
这可能吗?如果这可能怎么办?
你想要的可能是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);
});
});
这取决于你想要做什么。
如果您只是想从两个单独的节点进程重用相同的模块(MyModule),那很容易。您只需将 require('MyModule') 放在 GrabModule 中,并且在运行 grab_module 时可以访问 MyModule。
如果您想在两个进程之间“共享” MyModule 包括其全局变量,则要复杂得多。您需要在两个进程之间定义一个进程间协议(通常是 REST over socket),并使用该协议从另一个进程访问一个进程中的模块。
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)
那这个呢:
my_modules 将作为具有公共 api (rest api, xml-rpc, ...) 的程序工作,grab_modules 将连接到 api 并从 my_modules 调用函数
如果您还需要与其他语言的互操作性和/或高速,ZeroMQ也是一种选择。虽然最初是一个普通的 C 库,但我在 NodeJS 绑定方面有很好的经验。
几乎所有流行语言都有一个 ZeroMQ 绑定,请参阅http://zeromq.org/bindings:_start