如何编写一个节点快递应用程序,服务大多数本地文件,但重新路由到另一个域?
我正在开发一个小型web应用程序,通常使用相对复杂的stream程构build,然后部署到WebLogic。
不过,我正在使用的部分是使用AngularJS,并且都是HTML和Javascript。 它通常使ajax调用到同一个域上的另一个webapp。 为了缩短我的开发周期,我想避免构build过程,并重新加载浏览器页面。
我想我可以用“节点快递”来做到这一点,但是细节让我无法理解。 我已经设法定义一个非常简单的应用程序,只是提供本地文件,但现在我必须弄清楚如何检测这些path中的一些匹配expression式,并将这些请求重新路由到请求到外部域。
所以,如果它得到“/diag/stuff.html”,“/foo/thing.html”,或者只是“/index.html”的请求,它会发回匹配相同path的文件。 但是,如果path匹配“/fooService/.*”,那么我必须将GET的响应发回到相同的path,但是在不同的主机和端口上。
到目前为止,这是我的小应用程序:
var express = require('express'); var app = express(); app.use("/", express.static(__dirname)); app.listen(8000);
更新:
我喜欢代理的想法,所以我做了一个“http-proxy”的本地安装(我忘记了,并且首先进行了全局安装),然后将脚本更改为:
var express = require('express'); var app = express(); var httpProxy = require('http-proxy'); var proxy = new httpProxy.RoutingProxy(); app.use("/", express.static(__dirname)); app.get('/FooService/*', function(req, res) { "use strict"; return proxy.proxyRequest(req, res, { host: "foohost.net", port: 80 }); }); app.listen(8000);
这失败了:
<path>\server.js:4 var proxy = new httpProxy.RoutingProxy(); ^ TypeError: undefined is not a function at Object.<anonymous> (<path>\server.js:4:13)
这里可能有什么问题?
更新:
在“require”之后看到“console.log(httpProxy)”的内容是否有用?
function ProxyServer(options) { EE3.call(this); this.web = this.proxyRequest = createRightProxy('web')(options); this.ws = this.proxyWebsocketRequest = createRightProxy('ws')(options); this.options = options; this.webPasses = Object.keys(web).map(function(pass) { return web[pass]; }); this.wsPasses = Object.keys(ws).map(function(pass) { return ws[pass]; }); this.on('error', this.onError.bind(this)); }
这是否提供了一个线索为什么“新的httpProxy.RoutingProxy()”说这是未定义的?
您可以使用http-proxy
并转发请求到不同的主机。 要安装http-proxy
你需要运行sudo npm install http-proxy
。 将处理代理的代码将如下所示:
httpProxy = require('http-proxy'); proxy = new httpProxy.RoutingProxy(); (...) app.get('/fooService/*', function (request, response) { "use strict"; return proxy.proxyRequest(request, response, { host : externalHost, port : 80 }); });
UPDATE
以上代码正在为http-proxy
proxy〜0.10.x工作。 从那以后很多东西在图书馆里都变了。 下面你可以find新版本的例子(在写作时〜1.0.2):
var httpProxy = require('http-proxy'), proxy = httpProxy.createProxyServer({}); (...) app.get('/fooService/*', function (request, response) { "use strict"; return proxy.web(request, response, { target: 'http://fooservice.com' }); });
如果redirect符合您的需求,那么这是最简单的解决scheme:
var express = require('express'); var app = express(); app.use(express.static(__dirname + '/public')); app.use(app.router); app.get('/fooService/*', function(req, res){ res.redirect(302, 'http://otherdomain.com:2222' + req.path); }); app.listen(8000);
请注意,对于静态文件使用子目录通常被认为是很好的做法(如上面的public
)。 否则,您可以查看您的应用程序文件本身以及您保存在应用程序根目录中