2

我正在尝试为实验目的创建一个简单的 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 中调试比在 Rhino 中要困难得多。任何帮助将不胜感激。

4

1 回答 1

3

正如我在评论中提到的,您的主要问题是您的.write.end调用没有正确绑定到上下文,因此它们只会翻转并抛出错误。

修复后,请求会给出 404,因为该headers属性将拉入host原始请求的标头,localhost:8484. 按照您的示例,它将被发送到 jquery.com 的服务器,并且它将 404。您需要host在代理之前删除标头。

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

delete options.headers.host;
于 2012-04-19T07:08:09.503 回答