私は、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 リクエストは実際には機能していません (クライアントが接続を確立していないようです)。これを達成するためのより良い方法はありますか