我正在寻找一种让套接字监听主进程上的HTTP请求,然后使用process.send()将任何传入连接和请求数据传递给子进程并处理子进程中的HTTP请求的方法过程
但是,我无法找到将传递的连接和请求数据附加到子进程中的HTTP服务器的方法,而无需通过套接字上的.listen()初始化服务器。
那么,是否有可能使用HTTP服务器来处理从另一个进程传入的连接?任何非公共API解决方案也会这样做(尽管希望是JavaScript端)。
我想我可以初始化服务器以侦听一些虚拟套接字,然后将传入的连接反弹,但这似乎不是最理想的。在我的情况下,传入侦听套接字或使用Cluster或反向代理也不是最佳选择。
答案 0 :(得分:3)
这是可能的,但首先你需要了解node.js的工作原理:
TCP服务器(来自net.createServer
)基本上是EventEmitter
,仅发出connection
个事件。
HTTP服务器(来自http.createServer
)是一个带有连接解析器的TCP服务器。
不幸的是,HTTP服务器硬连线到TCP服务器(see source):
function Server(requestListener) {
if (!(this instanceof Server)) return new Server(requestListener);
net.Server.call(this, { allowHalfOpen: true });
...
this.addListener('connection', connectionListener);
...
}
您需要将套接字传递给http.js中定义的connectionListener。好消息是模块导出它:
exports._connectionListener = connectionListener;
我没有尝试过这段代码,但它应该有一些调整:
var util = require('util'),
events = require('events'),
http = require('http'),
express = require('express'),
app = express();
function FakeServer() {
events.EventEmitter.call(this);
this.on('connection', http._connectionListener);
this.on('request', app);
}
util.inherits(FakeServer, events.EventEmitter);
var server = new FakeServer();
process.on('message', function ('socket', socket) {
server.emit('connection', socket);
});
// you can use app as a regular express app
app.get('/hello', function (req, res) {
res.send('world');
};