1.实现思路
①搭建http做事器,利用Node的http模块的createServer方法②吸收客户端发送的要求,便是要求报文,要求报文中包括要求行、要求头、要求体③将要求报文发送到目标做事器,利用http模块的request方法2.实现步骤
const http = require("http");const server = http.createServer();server.on('request',(req,res)=>{ res.end("hello world")})server.listen(3000,()=>{ console.log("running");})
第二步:吸收客户端发送到代理做事器的要求报文
const http = require("http");const server = http.createServer();server.on('request',(req,res)=>{ // 通过req的data事宜和end事宜吸收客户端发送的数据 // 并用Buffer.concat处理一下 // let postbody = []; req.on("data", chunk => { postbody.push(chunk); }) req.on('end', () => { let postbodyBuffer = Buffer.concat(postbody); res.end(postbodyBuffer) })})server.listen(3000,()=>{ console.log("running");})
这一步紧张数据在客户端到做事器端进行传输时在nodejs中须要用到buffer来处理一下。处理过程便是将所有吸收的数据片段chunk塞到一个数组中,然后将其合并到一起还原出源数据。合并方法须要用到Buffer.concat,这里不能利用加号,加号会隐式的将buffer转化为字符串,这种转化不屈安。

const http = require("http");const server = http.createServer();server.on("request", (req, res) => { var { connection, host, ...originHeaders } = req.headers; var options = { "method": req.method, // 随表找了一个网站做测试,被代理网站修正这里 "hostname": "www.nanjingmb.com", "port": "80", "path": req.url, "headers": { originHeaders } } //吸收客户端发送的数据 var p = new Promise((resolve,reject)=>{ let postbody = []; req.on("data", chunk => { postbody.push(chunk); }) req.on('end', () => { let postbodyBuffer = Buffer.concat(postbody); resolve(postbodyBuffer) }) }); //将数据转发,并吸收目标做事器返回的数据,然后转发给客户端 p.then((postbodyBuffer)=>{ let responsebody=[] var request = http.request(options, (response) => { response.on('data', (chunk) => { responsebody.push(chunk) }) response.on("end", () => { responsebodyBuffer = Buffer.concat(responsebody) res.end(responsebodyBuffer); }) }) // 利用request的write方法通报要求体 request.write(postbodyBuffer) // 利用end方法将要求发出去 request.end(); })});server.listen(3000, () => { console.log("runnng");})