使用 Node.js 创建反向代理的更优雅的方式
More elegant way of creating reverse proxy with Node.js
我正在使用hapi.js
在应用程序中提供html内容。现在我需要代理一些可能使用 websocket 的服务。
这是代理http://localhost:4000
http://localhost:5000/my/app
的工作代码:
hapi = require "hapi"
http-proxy = require 'http-proxy'
server = hapi.create-server 5000
server.route do
method: '*'
path: '/my/app/{f*}'
handler:
proxy:
map-uri: (request, callback) ->
resourceUri = request.url.path.replace('/my/app/', '/')
url = 'http://localhost:4000' + resourceUri
console.log 'url: ', url
callback(null,url);
pass-through: true
xforward: true
ws-proxy = http-proxy.create-proxy-server do
target:'http://localhost:4000/socket.io/'
ws-proxy.on 'error', (err, req, res) !->
console.log "error caught: ", err#, req
server.start !->
server.listener.on 'upgrade', (req, socket, head) !->
console.log "upgrade dedected"
ws-proxy.ws(req, socket, head)
#console.log req, socket, head
console.log 'Proxy started @ ' + server.info.uri
自动生成的 Javascript 代码是:
// Generated by LiveScript 1.3.1
(function(){
var hapi, httpProxy, server, wsProxy;
hapi = require("hapi");
httpProxy = require('http-proxy');
server = hapi.createServer(5000);
server.route({
method: '*',
path: '/my/app/{f*}',
handler: {
proxy: {
mapUri: function(request, callback){
var resourceUri, url;
resourceUri = request.url.path.replace('/my/app/', '/');
url = 'http://localhost:4000' + resourceUri;
console.log('url: ', url);
return callback(null, url);
},
passThrough: true,
xforward: true
}
}
});
wsProxy = httpProxy.createProxyServer({
target: 'http://localhost:4000/socket.io/'
});
wsProxy.on('error', function(err, req, res){
console.log("error caught: ", err);
});
server.start(function(){
server.listener.on('upgrade', function(req, socket, head){
console.log("upgrade dedected");
wsProxy.ws(req, socket, head);
});
console.log('Proxy started @ ' + server.info.uri);
});
}).call(this);
有没有办法在不对http://localhost:4000/socket.io/
的websocket地址进行硬编码的情况下实现相同的目标?
因此,从阅读您始终代理的代码到http://localhost:4000/socket.io/
,但是您希望这是动态的?
您可以将要在初始请求中代理的服务器作为参数传递吗? 您可能会在 WebSocket 构造函数的 protocol
字段中传递此字段。然后在服务器上阅读此内容on-open
事件。
相关文章:
- 为什么这在IE中的工作方式与在Firefox中不同
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 在localhost Dev Box上测试JSONP请求的最佳方式
- 在不打开聊天屏幕的情况下制作Zopim-ding代理
- 使用javascript存储变量的最安全方式
- 以可优化的方式使用requirejs加载模板
- 在Highcharts中,我们可以通过任何方式在渲染图表之前获得plotWidth和plotHeight
- 任何方式使AJAX调用Gmail API,而无需通过JS库
- 为react组件传递道具的最佳方式
- 让Webpack管理Quirky AMD定义的最佳方式
- 在承诺链中处理早期回报的最佳方式
- 如何“;过滤器”;或者以其他方式重构该数据
- 您有更好的动态方式来缩短复杂的代码jquery吗
- 在ng重复循环中显示条件内容的最佳方式是什么
- 在phonegap中为android调用onload函数的最佳方式
- 如何创建更好的方式来维护基于我的代码访问的最后一个页面
- 使用 Node.js 创建反向代理的更优雅的方式
- 如何以编程方式获取ie10'的REAL用户代理
- 如何以编程方式检测用户代理是否阻止访问Facebook