node实现代理的中间件
方法一:手动实现中间件
// api 请求的代理 // 如果是以 /data/api/xxx 需要去代理到其他的服务器中 const http = require('http'); const context = '/data'; module.exports = (req, res, next) => { // 如果传入的请求路径中,包含 context 那么就走代理,反之,不需要使用代理 let url = req.path; if (url.indexOf(context) === -1) { next(); } else { // 存在需要代理的地址 url = url.substr(context.length); // 创建代理请求 const rq = http.request({ host: 'chenliangliang.top', port: 3000, method: req.method, headers: req.headers, path: url }, (ims) => { // 响应代理,设置响应码 res.status(ims.statusCode); // 设置响应头 for (let key in ims.headers) { res.setHeader(key, ims.headers[key]); } // 代理响应体 ims.pipe(res); }) // 发送请求 req.pipe(rq); } }
方法二:使用http-proxy-middle
const { createProxyMiddleware } = require("http-proxy-middleware"); const context = "/data"; module.exports = createProxyMiddleware(context, { target: "http://chenliangliang.top:3000", pathRewrite: function (path, req) { console.log(path.substr(context.length)); return path.substr(context.length); }, });
原理
在做代理的时候,我们需要考虑,我们代理的是客户端去请求后台服务器,node
只是作为中间服务来,来承担一些很基本的功能,然后在把服务断返回的数据,也需要经过我们的代理来把数据返回给客户端。这么做的好处是,隐藏真正的服务器请求地址,减少数据的暴露,许多数据都可以在代理那里做个性化的配置