我正在扩展我与mikeal的请求模块https://github.com/mikeal/request放在一起的node.js反向代理。它是一个连接应用程序,它使用一小块自定义中间件来检查当前请求是否是针对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请求实际上没有工作(客户端似乎永远不会建立连接)。有没有更好的方法来实现这个