使用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()
函数中发送req
或req.socket
对象。
另外,你没有从注册到process.on('message')
事件的函数的第二个参数访问req
或req.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