Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
578 views
in Technique[技术] by (71.8m points)

node.js - How to duplicate and forward a request with koa router

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?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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)
})

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

56.8k users

...