使用node.js实现一个简单的代理服务器

我试图创build一个简单的node.js代理服务器的实验目的,我想出了这个简单的脚本:

var url = require("url"); var http = require("http"); var https = require("https"); http.createServer(function (request, response) { var path = url.parse(request.url).path; if (!path.indexOf("/resource/")) { var protocol; path = path.slice(10); var location = url.parse(path); switch (location.protocol) { case "http:": protocol = http; break; case "https:": protocol = https; break; default: response.writeHead(400); response.end(); return; } var options = { host: location.host, hostname: location.hostname, port: +location.port, method: request.method, path: location.path, headers: request.headers, auth: location.auth }; var clientRequest = protocol.request(options, function (clientResponse) { response.writeHead(clientResponse.statusCode, clientResponse.headers); clientResponse.on("data", response.write); clientResponse.on("end", function () { response.addTrailers(clientResponse.trailers); response.end(); }); }); request.on("data", clientRequest.write); request.on("end", clientRequest.end); } else { response.writeHead(404); response.end(); } }).listen(8484); 

我不知道我要去哪里错了,但是当我尝试加载任何页面时,它给了我下面的错误:

 http.js:645 this._implicitHeader(); ^ TypeError: Object #<IncomingMessage> has no method '_implicitHeader' at IncomingMessage.<anonymous> (http.js:645:10) at IncomingMessage.emit (events.js:64:17) at HTTPParser.onMessageComplete (http.js:137:23) at Socket.ondata (http.js:1410:22) at TCP.onread (net.js:374:27) 

我想知道问题是什么。 在node.js中debugging比在Rhino中要困难得多。 任何帮助将不胜感激。

正如我在评论中提到的那样,你的主要问题是你的.write.end调用没有被正确地绑定到一个上下文,所以他们只会翻转出来,抛出错误。

在这个固定的情况下,请求会提供一个404,因为headers属性将拉入原始请求的hostlocalhost:8484 。 按照你的例子,这将发送到jquery.com的服务器,它将404。你需要在代理之前删除host头。

在调用protocol.request之前添加这个。

 delete options.headers.host;