node-http-proxy模块的功能是转发http请求,其基本原理是通过使用http或https模块来构建node代理服务器,然后将客户端发送的请求数据转发到目标服务器,再将响应数据返回给客户端。与koa的中间件机制类似,node-http-proxy模块在请求转发过程中会组装一个任务队列,并逐个执行队列中的处理函数。这些处理函数通常用来封装消息头,而最后一个处理函数负责转发请求和输出响应。node-http-proxy模块同时接受全局配置的options和特定请求中的配置项opts。客户端发送的请求可能是http、https或websocket请求,因此node-http-proxy模块需要对这三类请求进行不同的处理。这通过createRightProxy高阶函数实现,createRightProxy('web')(options)和createRightProxy('ws')(options)可以创建实际的请求转发函数。其中,proxyServer.web方法作为http或https服务器的listen方法的回调函数,proxyServer.ws方法作为'upgrade'事件的绑定函数,以便在客户端ajax请求或websocket请求执行时与之对接。除此之外,ProxyServer还提供了before(type, passName, callback)和after(type, passName, callback)原型方法,可以在任务队列的某个具体处理函数之前或之后插入一个处理函数callback。在http、https请求中,this.webPasses任务队列包含四种处理函数:deleteLength, timeout, XHeaders, stream。其中,stream函数的处理流程为:首先,common.setupOutgoing的实现;其次,stream的实现;最后,查看源码了解web-outgoing模块对代理响应的处理。setRedirectHostRewrite函数的代码实现也在这里。在websocket请求中,this.wsPasses任务队列包含四种处理函数:checkMethodAndHeader, XHeaders, stream。stream函数的处理流程同上。http-proxy-middleware和nokit-filter-proxy库都使用了node-http-proxy来实现服务器代理功能。http-proxy-middleware库的源码解读可以参考相关文章。nokit-filter-proxy库用于为nokit服务器添加代理功能,它是通过绑定onRequest事件函数来实现请求的拦截和转发的。这两篇文章都是在作者整理完proxy设计模式后整理的。由于作者水平有限,文章中可能存在错误或不足之处,欢迎读者批评指正。