我正在扩展我与 mikeal 的请求模块放在一起的 node.js 反向代理:https ://github.com/mikeal/request 。它是一个连接应用程序,它使用一小块自定义中间件来检查当前请求是否是针对 API 路由的,如果是,它会像这样将其代理到不同的 API 服务器或从不同的 API 服务器代理它:
.use(function(req, res, next){
if( /^\/api\//.test(req.url) ){
req.pipe(request(apiUrl + req.url))
.on('error', function(err){
handlePipeError(err, 'Error piping request to proxy server. Details: ');
})
.pipe(res)
.on('error', function(err){
handlePipeError(err, 'Error piping proxy response to client. Details: ')
});
function handlePipeError(err, customMsg) {
console.log( customMsg, err );
res.writeHead(503, {
'Content-Length': Buffer.byteLength(err.message, 'utf8'),
'Content-Type': 'text/plain' });
res.end(err.message);
}
}
else {
next();
}
还有一些其他中间件来处理静态文件服务和其他一些东西。设置好所有中间件后,我将像这样启动服务器:
var server = require('http').createServer(app);
server.listen(port)
我现在想扩展这个脚本以允许反向代理 websocket 连接。我尝试使用 nodejitsu/node-http-proxy 来修改代码的前一部分,如下所示:
var options = {
ws: true,
target: apiUrl,
secure: false,
xfwd: true
};
var wsProxy = require('http-proxy').createProxyServer(options);
var server = require('http').createServer(app);
server.on('upgrade', function (req, socket, head) {
console.log("--- CAUGHT UPGRADE ----");
wsProxy.ws(req, socket, head);
});
server.listen(port);
我注意到升级事件触发并且回调函数确实运行但 websockets 请求实际上并没有工作(客户端似乎永远不会建立连接)。有没有更好的方法来实现这一点