How to duplicate and forward a request with koa router

拜拜、爱过 提交于 2021-01-29 17:23:00

问题


For several reasons, I have a server that has to forward requests to another server. The response should be the response of the final server. I also need to add an extra header onto the request but remove this header again from the response before returning. As such, redirect isn't going to cut it.

I'm currently doing it manually copying the headers & body as required but I would like to know if there's a simple generic way to do it?


回答1:


A proxy would work for this. Assuming @koa/router or something simliar and the http-proxy module (there are also wrapper modules for Koa that may work:

const proxy = httpProxy.createProxyServer({
  target: 'https://some-other-server.com',
  // other options, see https://www.npmjs.com/package/http-proxy
})
proxy.on('proxyReq', (proxyReq, req, res, options) => {
  proxyReq.setHeader('x-foo', 'bar')
})
proxy.on('proxyRes', (proxyRes, req, res) => {
  proxyRes.removeHeader('x-foo')
})

router.get('/foo', async (ctx) => {
  // ctx.req and ctx.res are the Node req and res, not Koa objects
  proxy.web(ctx.req, ctx.res, {
    // other options, see docs
  })
})

You could also lift the proxy out of a route if you happen to be starting your Koa server with http.createServer rather than app.listen:

// where app = new Koa()
const handler = app.callback()
http.createServer((req, res) => {
  if (req.url === '/foo') {
    return proxy.web(req, res, options)
  }

  return handler(req, res)
})


来源:https://stackoverflow.com/questions/65614506/how-to-duplicate-and-forward-a-request-with-koa-router

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!