node.js简单代理服务器

时间:2014-04-06 09:32:12

标签: javascript node.js

我正在尝试在nodejs中实现简单的匿名http代理服务器

var http = require('http'),
    request = require('request');
http.createServer(function(req,res){
    req.pipe(request(req.url)).pipe(res)
}).listen(8888)

我收到以下错误:

stream.js:94
      throw er; // Unhandled stream error in pipe.
            ^
Error: CERT_HAS_EXPIRED
    at SecurePair.<anonymous> (tls.js:1370:32)
    at SecurePair.EventEmitter.emit (events.js:92:17)
    at SecurePair.maybeInitFinished (tls.js:982:10)
    at CleartextStream.read [as _read] (tls.js:469:13)
    at CleartextStream.Readable.read (_stream_readable.js:320:10)
    at EncryptedStream.write [as _write] (tls.js:366:25)
    at doWrite (_stream_writable.js:226:10)
    at writeOrBuffer (_stream_writable.js:216:5)
    at EncryptedStream.Writable.write (_stream_writable.js:183:11)
    at write (_stream_readable.js:583:24)
    at flow (_stream_readable.js:592:7)
    at Socket.pipeOnReadable (_stream_readable.js:624:5)

这是另一个错误:

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: Invalid protocol

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

req.url是一个相对路径,而不是一个完整的网址。这意味着您应该为其添加协议和域名:

req.pipe(request('http://mydomain.com'+req.url)).pipe(res)

您还忘记了req.methodreq.headers

req.pipe(request({
  url: 'http://mydomain.com'+req.url,
  method: req.method,
  headers: req.headers
})).pipe(res)

如果您的目的是将其用作真正的代理服务器,那么我建议您查看node-http-proxy - 这是一个完美的node.js代理服务器实现。

如果您只想学习node.js,请查看this article with example proxy server implementation。本文的作者使用内置http模块来发送请求而不是更强大的request module而不使用管道,但本文的其余部分看起来很好。

至于你的第一个问题,Piotr Tomasik's answer should help you

答案 1 :(得分:1)

您看到的域名看起来已过期。

将其添加到文件的顶部。

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

至于您的第二个错误,请确保该网址包含协议。 http https