nodejs:使用http-proxy的路由表

尝试使用http-proxy 1.4.3使用自定义路由逻辑放置一个http代理,然后执行以下代码并执行以下代码:

var httpProxy = require("http-proxy"); var url = require("url"); httpProxy.createServer(function(req, res, proxy) { var hostname = req.headers.host.split(":")[0]; var pathname = url.parse(req.url).pathname; // Options for the outgoing proxy request. var options = { host: hostname }; // Routing logic if(hostname == "127.0.0.1") { options.port = 8083; } else if(pathname == "/upload") { options.port = 8082; options.path = "/"; } else { options.port = 8081; } // (add more conditional blocks here) proxy.proxyRequest(req, res, options); }).listen(8080); console.log("Proxy listening on port 8080"); // We simulate the 3 target applications var http = require("http"); http.createServer(function(req, res) { res.end("Request received on 8081"); }).listen(8081); http.createServer(function(req, res) { res.end("Request received on 8082"); }).listen(8082); http.createServer(function(req, res) { res.end("Request received on 8083"); }).listen(8083); 

当尝试,如tuto所示,访问http://localhost:8080/anything我最终以下面的错误

 /var/www/node.proxy/node_modules/http-proxy/lib/http-proxy/index.js:119 throw err; ^ Error: Must provide a proper URL as target at ProxyServer.<anonymous> (/var/www/node.proxy/node_modules/http-proxy/lib/http-proxy/index.js:68:35) at Server.closure (/var/www/node.proxy/node_modules/http-proxy/lib/http-proxy/index.js:125:43) at Server.EventEmitter.emit (events.js:98:17) at HTTPParser.parser.onIncoming (http.js:2108:12) at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:121:23) at Socket.socket.ondata (http.js:1966:22) at TCP.onread (net.js:525:27) 

因为我是一个nodejs noobie,我真的无能为力。

       

网上收集的解决方案 "nodejs:使用http-proxy的路由表"

所以在上面的评论中,@BadZen提到过,代码已经过时了,在通过http-proxy自述之后,我最终编辑了我的代码(而且是的),当然我创build了apache vhosts对于foo.locbar.loc使用proxy-reverse,因此它们指向localhost:9000 ,但是它超出了这个问题的范围

 var http = require('http'), httpProxy = require('http-proxy'), proxy = httpProxy.createProxyServer({}), url = require('url'); http.createServer(function(req, res) { var hostname = req.headers.host.split(":")[0]; var pathname = url.parse(req.url).pathname; console.log(hostname); console.log(pathname); switch(hostname) { case 'foo.loc': proxy.web(req, res, { target: 'http://localhost:9001' }); break; case 'bar.loc': proxy.web(req, res, { target: 'http://localhost:9002' }); break; default: proxy.web(req, res, { target: 'http://localhost:9003' }); } }).listen(9000, function() { console.log('proxy listening on port 9000'); }); // We simulate the 3 target applications http.createServer(function(req, res) { res.end("Request received on 9001"); }).listen(9001); http.createServer(function(req, res) { res.end("Request received on 9002"); }).listen(9002); http.createServer(function(req, res) { res.end("Request received on 9003"); }).listen(9003);