使用fork在subprocess中传递和访问请求响应对象

我想知道如何从父进程传递请求响应对象到使用fork的subprocess。 我做的是

var child = cp.fork(__dirname + '/childProcess.js', req, res); child.on('message', function(m) { console.log("child process returned data " + m); }); child.send("hello"); 

childProcess.js

 var req = process.argv[2]; var res = process.argv[3]; process.on('message', (msg) => { console.log("req object :-" + req ); console.log("res object :-" + res); } process.send("callparent"); 

这使我在subprocess中不确定。 我也试过child.send(“hello”,req.socket)。 但后来我不能访问subprocess中的请求的方法。 它显示为圆形结构。

其他的答案是告诉你发送套接字给孩子,让孩子听和处理请求,这不是问(如何发送请求/资源给孩子)的问题。 如果您的目标是将套接字传递给孩子,并让孩子监听并处理请求,那么这些答案就没有问题。 如果您的目标是在主stream程中侦听和预处理请求,并将这些请求传递给subprocess以供进一步处理,请参阅下面的内容:

简单的答案是你必须明确地发送请求和响应给subprocess(它们不会神奇地出现在subprocess中)。 但是有一些挑战。

在我们的应用程序中,我们有类似的问题 我们的主要请求处理器检查请求,以查看哪个subprocess应该处理每个请求,然后将该请求发送到subprocess(通过child.send() )。

在父和子之间传递请求/响应的问题是你必须能够序列化发送来回send的对象,而请求对象特别是不能被序列化(它充满了循环引用,引用许多其他物体等)。

因此,我们所做的是将数据的子集从subprocess需要的请求中拉出来,然后通过child.send()将该“轻量级请求”对象发送给subprocess,同时保持对原始请求的引用在父进程上排队。 当subprocess完成处理后,它通过parent.send()将其响应数据发送回父节点,父节点与待处理队列中的原始请求相匹配,并使用响应数据满足请求。

这种方法的好处(与在父/子之间创build一个自定义协议相反)是子请求处理代码仍然在请求/响应对象(只是它们的轻量级版本)上运行。 在我们的例子中,这意味着我们可以使用相同的请求处理代码,无论我们是在subprocess中调用它,还是让进程直接监听和处理请求。

例如,下面是如何创build一个轻量级的,可序列化的请求对象并将其发送给subprocess:

 var requestData = { httpVersion: request.httpVersion, httpVersionMajor: request.httpVersionMajor, httpVersionMinor: request.httpVersionMinor, method: request.method, url: request.url, headers: request.headers, body: request.body } child.send(requestData); 

你也可以使用一些东西,如lodashselect抓住你想要的领域。

这个解决scheme的棘手部分是,如果您需要调用请求/响应的任何方法,您必须在父对象(实际对象所在的位置 – 所有子对象都是所选数据)中执行此操作。

根据文件 :

child.send(message [,sendHandle] [,callback])

可以传递给child.send()的可选sendHandle参数用于将TCP服务器或套接字对象传递给subprocess。 子对象将作为第二个parameter passing给在process.on('message')事件中注册的callback函数。

这表明你应该在child.send()函数中发送reqreq.socket对象。

另外,你没有从注册到process.on('message')事件的函数的第二个参数访问reqreq.socket对象。

您创build一个服务器,并将句柄发送到客户端。 如果你使用快递,例如,你可以做:

Server.js

 child= require('child_process').fork('child.js'); const server = require('net').createServer(); server.on('connection', function(socket) { child.send('handle', socket); }).listen(80); 

然后你创build一个孩子,并接受句柄:

Child.js

 var app=require('express')() app.get('/',function(req,res){ console.log(req.headers) res.send('Working!') }) var myServer=require('http').createServer(app) process.on('message', function(m, server) { if (m === 'handle') myServer.listen(handle) }); 

更多信息:

  • Server.listen可以得到一个句柄: https : //nodejs.org/api/http.html#http_server_listen_handle_callback
  • 向subprocess发送句柄: https : //nodejs.org/api/child_process.html#child_process_child_send_message_sendhandle_callback