nodejs节点代理,使用路由表并修改响应

我们有一个简单的nodejs过程来testing/开发我们实验室的工作。 我们使用节点代理来设置一个反向代理,它允许我们使用http(即http – > https)与https服务器进行通信。 作为这个的一部分,我们有一些修改响应的代码。 这是我们正在做的事情:

var http = require('http'), httpProxy = require('http-proxy'), endserver = 'server.local', endport = 8443; var proxy = new httpProxy.HttpProxy({ target: { https: true, host: endserver, port: endport } }); http.createServer(function (req, res) { //our code for modifying response is here... proxy.proxyRequest(req, res); }).listen(8001); 

我想build立一个节点代理路由表,就像这里的例子,所以我可以根据请求中的主机名将请求转发到不同的https服务器上(我将在我们的dns上设置多个主机名,指向运行相同的服务器nodejs代理)。

我怎样才能有一个节点代理路由表,并修改响应?

(我对node.js相当新,但不是JavaScript)

如果我正确地阅读你的问题,你只需要知道如何使用节点代理路由表根据请求对象路由不同主机的请求。 这实际上是由node-http-proxy文档处理的: 使用ProxyTable的代理请求

粘贴它,你只需要像这样在一个JS对象中configurationpath:

 var options = { router: { 'foo.com/baz': '127.0.0.1:8001', 'foo.com/buz': '127.0.0.1:8002', 'bar.com/buz': '127.0.0.1:8003' } }; 

然后在您创build代理服务器时传递此对象:

 var proxyServer = httpProxy.createServer(options); proxyServer.listen(80); 

为你的代码指定这个结果就像这样:

 var http = require('http'), httpProxy = require('http-proxy'), endserver = 'server.local', endport = 8443; var options = { router: { endserver + '/foo': '127.0.0.1:8081', endserver + '/bar': '127.0.0.1:8082', endserver + '/baz': '127.0.0.1:8083' } }; var proxyServer = httpProxy.createServer(options); proxyServer.listen(endport); http.createServer(function (req, res) { // your code for modifying response is here... proxy.proxyRequest(req, res); }).listen(8001); 

使用路由器选项时无需自己设置目标。 看来https的区别也被处理了,但我不确定。 我从proxy-table.js源获得了这个信息。 尤其是:

 ProxyTable.prototype.setRoutes = function (router) { if (!router) { throw new Error('Cannot update ProxyTable routes without router.'); } var self = this; this.router = router; if (this.hostnameOnly === false) { this.routes = []; Object.keys(router).forEach(function (path) { if (!/http[s]?/.test(router[path])) { router[path] = (self.target.https ? 'https://' : 'http://') + router[path]; } var target = url.parse(router[path]), defaultPort = self.target.https ? 443 : 80; // // Setup a robust lookup table for the route: // // { // source: { // regexp: /^foo.com/i, // sref: 'foo.com', // url: { // protocol: 'http:', // slashes: true, // host: 'foo.com', // hostname: 'foo.com', // href: 'http://foo.com/', // pathname: '/', // path: '/' // } // }, // { // target: { // sref: '127.0.0.1:8000/', // url: { // protocol: 'http:', // slashes: true, // host: '127.0.0.1:8000', // hostname: '127.0.0.1', // href: 'http://127.0.0.1:8000/', // pathname: '/', // path: '/' // } // }, // self.routes.push({ source: { regexp: new RegExp('^' + path, 'i'), sref: path, url: url.parse('http://' + path) }, target: { sref: target.hostname + ':' + (target.port || defaultPort) + target.path, url: target } }); }); } };