Cloudflare Worker报错:TypeError: 无法重建已使用请求体的Request
Cloudflare Worker 报错:
TypeError: Cannot reconstruct a Request with a used body 我在Cloudflare Worker代码中实现了两个函数,调用时触发上述错误。经日志排查,报错发生在postData函数的let response = await fetch(request)行——已打印"checked cache",但未打印"Requested new token"。
已尝试的解决方案:
- 通过
request.clone()克隆请求后执行fetch - 重新创建相同的Request对象发起请求
- 结合
slice()复制data后创建Request
补充说明:使用Cloudflare Worker Modules,无法访问event;报错前打印request.bodyUsed结果为false。
相关代码如下:
async function getApiV2Token(env: Env): Promise<string> { let API_URL = await getApiUrl(env) let API_CLIENT_ID = await getApiClientId(env) let API_CLIENT_SECRET = await getApiClientSecret(env) let apiUrl = `${API_URL}/auth` let data = `client_id=${API_CLIENT_ID}&client_secret=${API_CLIENT_SECRET}` let response, responseJSON try { response = await postData(apiUrl, data) responseJSON = await response.json() } catch (e) { console.log(`Error: ${e}.`) return "" } return responseJSON.auth_token } async function postData(url: string, data: string): Promise<Response> { let request = new Request(url, { method : 'POST', body : data, headers: { 'User-Agent': 'cloudflare-worker', 'Content-Type': 'application/x-www-form-urlencoded' }, redirect : 'manual' }) let cache = caches.default let cachedResponse = await cache.match(request.url) if (cachedResponse) { return cachedResponse } console.log("checked cache") let response = await fetch(request) console.log("Requested new token") let newResponseForExpiresIn = response.clone() let newResponseForExpiresInJSON = await newResponseForExpiresIn.json() let expires_in = newResponseForExpiresInJSON.expires_in let newResponseForHeader = response.clone() let newResponseToCache = new Response(newResponseForHeader.body, newResponseForHeader) newResponseToCache.headers.set('Cache-Control', `max-age=${expires_in - API_TOKEN_GRACE_PERIOD}`) cache.put(request.url, newResponseToCache) return response }
内容的提问来源于stack exchange,提问作者VBoi
相关产品推荐
相关产品推荐

