var http = require(‘http’); var url = require(‘url’); var server = http.createServer(function(sreq,sres){ var url_parts = url.parse(sreq.url); console.log(“conn!”); var opts = { host:‘www.amazon.cn’, port:80, path:url_parts.pathname, headers:sreq.headers }; console.log(opts.path); var creq = http.get(opts,function(cres){ sres.writeHead(cres.statusCode,cres.headers); cres.pipe(sres); }); sreq.pipe(creq); }); server.listen(1377,‘127.0.0.1’); 书上看到了服务器代理的例子,其中加粗的那行代码不是很理解,为什么还要把原始的请求写入到代理的get请求里?
看起来是写反了 应该是creq.pipe(sreq) 不过这个也不是完整的代理 只考虑到了get请求,还比较简单
@frosh 哦,如果是creq.pipe(sreq)的话,这句代码有什么作用,或者说有什么应用
感觉没啥用,你有没有把那一句去掉,run下代码,看看有啥不同吗?
head数据后面可能还有body,双向的。get无所谓,试个post就清楚了。
个人觉得要么node做一个像nginx一样的可配置的代理(数据从内核copy到用户内存,再从用户内存copy到javascript,再从javascriptc种中copy到用户内存,最后朝内核copy,这搞来搞去是闲得蛋疼,nginx可以减少两次内存copy),否则还不如直接用nginx好,练手当然可以。
agentResponse.pipe( response );
这个是把从代理地址获取到的响应流转接到 当前服务的响应流,然后直接输出给客户端, 事实上使用nodejs做http代理还是蛮简单和方便的。
我这边 f2e-server 里面有一段有关代理的简单实现 ( 跟Nginx的主要不同点在于简单模拟了一个多域的setCookie )。 https://github.com/shy2850/node-server/blob/master/nodeLib/filter/agent.js