2012-06-04 31 views
5

如何使用從其他Node進程從另一個Node進程加載的模塊。Node.js到Node.js通信

實施例I運行:

node my_modules 

其中負載MyModule

然後我將運行另一種的NodeJS過程:

node grab_modules 

這將運行GrabModule

GrabModule將嘗試使用功能s內MyModule

這可能嗎?如果這可能如何?

+5

不知道你想在這裏做什麼。請提供一個更具體的例子,說明您理想的情況。 –

+0

如果你問我,問題可能會更清楚。 – Alfred

回答

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); 
    }); 
}); 
0

這取決於你想要做什麼。

如果您只是想從兩個單獨的節點進程重用相同的模塊(MyModule),那很容易。你只需要在GrabModule中放入require('MyModule'),並且在運行grab_module時可以訪問MyModule。

如果你想在兩個進程中'共享'MyModule包括它的全局變量,它要複雜得多。您需要在兩個進程(通常是套接字上的REST)之間定義一個進程間協議,並使用該協議在另一進程的一個進程中訪問該模塊。

0

1)要在不同的進程中使用模塊(實現)而不是實例(模塊在進程的某處使用require加載),只需要在需要的地方需要該模塊。

如果在進程B中運行兩個進程,例如使用'MyModule'的進程A和使用'GrabModule'的進程B,但只需要'GrabModule',就可以訪問導出的' MyModule「,那麼你只需要使用require('MyModule的路徑')。 2)另一方面,如果你需要一個進程B,可以訪問一個進程A的模塊狀態(一個已經執行的模塊,因爲你在某處使用require),那麼你需要使用一個IPC(進程間通信),允許在進程A和進程B之間交換數據,並在其上建立或使用相同的協議。

根據您的進程是在同一臺機器上還是在不同的機器上,可以在同一個操作系統上使用某些IPC版本,如nodejs提供的子fork(http://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options)或使用內置在某個網絡通道中的IPC。

例如,你可以使用Redis的的發佈/訂閱消息系統(http://redis.io/topics/pubsub

0

這個怎麼樣:

my_modules將作爲公共API的程序(REST API,XML-RPC, ...) 和grab_modules將連接到api和從my_modules呼叫功能

0

如果您還需要與其他語言和/或高速互操作性,ZeroMQ也是一個選項。雖然最初是一個普通的C庫,但我對NodeJS綁定有很好的體驗。

有一個ZeroMQ幾乎所有流行的語言綁定,請參閱http://zeromq.org/bindings:_start