koa实现请求转发 Published on Dec 3, 2020 in 前端linuxmac with 0 comment ## koa实现请求转发 首先我们来用koa创建一个简单的服务: ```js const Koa = require('koa') const app = new Koa() const port = process.env.PORT || 3000 app.listen(port, () => { console.log(`启动地址: http://localhost:${port}`) }) ``` 给服务添加跨域需要的响应头: ```js app.use(async (ctx, next) => { ctx.set("Access-Control-Allow-Origin", '*'); ctx.set("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS"); ctx.set('Access-Control-Allow-Headers', '*'); ctx.set("Access-Control-Allow-Credentials", "true"); await next() }) ``` > 浏览器在跨域请求的时候会有`OPTIONS`预检请求 处理`OPTIONS`预检请求 ```js // …… if (ctx.method === 'OPTIONS') { ctx.body = 200 } else { await next() } // …… ``` 接下来我们使用 `http-proxy-middleware` 处理转发 ```js const { createProxyMiddleware } = require('http-proxy-middleware') const k2c = require('koa2-connect') const proxyList = [ // 需要转发的请求地址 'http://www.xxxx.com' ] // …… app.use(async (ctx, next) => { const url = ctx.path if (url.startsWith('/_')) { ctx.response = false await k2c( createProxyMiddleware({ target: proxyList[0], changeOrigin: true, ws: false, secure: false, pathRewrite: { '^/_': '/' } }), )(ctx, next) return await next() } return await next() }) ``` 最终的代码 ```js const Koa = require('koa') const { createProxyMiddleware } = require('http-proxy-middleware') const k2c = require('koa2-connect') const proxyList = [ // 需要转发的请求地址 'http://www.xxxx.com' ] const port = process.env.PORT || 3000 const app = new Koa() app.use(async (ctx, next) => { ctx.set("Access-Control-Allow-Origin", '*'); ctx.set("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS"); ctx.set('Access-Control-Allow-Headers', '*'); ctx.set("Access-Control-Allow-Credentials", "true"); if (ctx.method === 'OPTIONS') { ctx.body = 200 } else { await next() } }) app.use(async (ctx, next) => { const url = ctx.path if (url.startsWith('/_')) { ctx.response = false await k2c( createProxyMiddleware({ target: proxyList[0], changeOrigin: true, ws: false, secure: false, pathRewrite: { '^/_': '/' } }), )(ctx, next) return await next() } return await next() }) app.listen(port, () => { console.log(`启动地址: http://localhost:${port}`) }) ``` ## nginx配置请求转发 nginx请求转发的配置详见另一篇文章 [nginx配置请求转发](https://nothankyou.cn/index.php/archives/83/) 本文由 tutustack 创作,采用 知识共享署名4.0 国际许可协议进行许可本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名