如何编写一个节点快递应用程序,服务大多数本地文件,但重新路由到另一个域?

我正在开发一个小型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 )。 否则,您可以查看您的应用程序文件本身以及您保存在应用程序根目录中