跳转到内容
加入 「福强私学」,学习和了解更多关于技术、管理与人生的精彩内容。

如何在一个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
})
加入「福强私学」

学习和了解更多关于技术、管理与人的精彩内容。

如果已经购买「福强私学」,可以直接点击这里开始访问

©️王福强个人版权所有