如何在一个handler中将请求转交给handler处理?
Q: How to forward request to another handler from current handler ?
A: use app.request(...)
细节描述
虽然honojs的文档上说,app.request对于测试来说很有用(request is a useful method for testing.), 但是,我们同样可以在生产代码中使用。
有些时候,我们会需要某个共享的handler的处理逻辑,虽然可以通过提取共享代码的方式也能达到目的,但跟honojs推荐的最佳实践不太契合 [^controller]。
[^controller]:Don’t make “Controllers” when possible
所以,我们选择在HandlerA中将请求转交(forward)给HandlerB(也就是共享逻辑)去处理。
如果通过在HandlerA中使用HTTP fetch API来调用HandlerB(走路由route),那么,需要走公网,多一次来回(round trip),而且,cloudflare worker也不支持这么干。
最后,我们可以选择使用honojs的app.request完成请求的转发:
app.get('/handlerA', async (c) => { ... console.log("forward request to API endpoint") let bearerToken = await c.env.credentials.get("K_TOKEN") // to avoid error : Cannot reconstruct a Request with a used body. | Can't modify immutable headers. let extendedRequest = new Request("/signup", { method: "POST", headers: { ...c.req.raw.headers, Authorization: `Bearer ${bearerToken}` }, body: JSON.stringify(payload) }) let forwardResponse = await app.request(extendedRequest.url, extendedRequest, c.env, c.executionCtx) console.log(`forward response receives, return to client: ${forwardResponse}`) return forwardResponse})