AI通识课
在HonoJS里如何对Web请求进行转发或者代理给外部服务?
假如我们要在honojs的handler里对外部请求进行转发,那么,直觉上是使用下面的代码:
const response = await fetch(c.req.raw) // "TypeError: Can't modify immutable headers."return response
理想很丰满,但现实很骨感,上面的代码会出现运行期错误:
"TypeError: Can't modify immutable headers."
即使我们没有对原始请求或者返回的响应做任何变更,依然会出现以上问题,要解决这个问题,需要对请求和响应(主要是响应)进行重新封装:
const request = new Request(c.req.url, { headers: { ...c.req.raw.headers }})const response = await fetch(request)// return response // "TypeError: Can't modify immutable headers."return new Response(response.body, response)
这样,就不会出现以上的报错了。
而且,我们可以在转发前对请求做进一步的修改,比如增加更多header:
const request = new Request(c.req.url, { headers: { ...c.req.raw.headers, 'custom_header':'any value' }})const response = await fetch(request)...
对于收到响应之后,也同样可以对新封装的Response增减内容。
honojs的官方文档中也有相关说明: https://hono.dev/guides/examples#proxy,我是在调试cloudflare worker的时候碰到的类似问题。
「架构师的修炼」大礼包
管理者入门与进阶课程