我正在尝试在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
有什么建议吗?
答案 0 :(得分:3)
req.url
是一个相对路径,而不是一个完整的网址。这意味着您应该为其添加协议和域名:
req.pipe(request('http://mydomain.com'+req.url)).pipe(res)
您还忘记了req.method
和req.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