如何使用Got同时获取响应JSON数据与响应头?
解决Got请求Strapi API时重复请求与单次请求崩溃的问题
你遇到的核心问题是单次请求代码中未正确处理异步的JSON解析操作,导致程序崩溃且错误无法被捕获,同时原代码发起两次请求是因为重复调用了got.get(url)。
错误原因分析
第二次代码里的const body = response.json()没有添加await关键字:
response.json()是异步方法,返回的是一个Promise对象,直接将其传入res.json()会触发JSON序列化失败- 未await的Promise如果发生reject,会变成未捕获的Promise拒绝错误,这种错误不会被外层的try/catch捕获,导致程序崩溃且catch里拿到的错误为空
正确的单次请求代码
res.setHeader('Content-Type', 'application/json') try { const request = req.query.request const decodedRequest = Buffer.from(request, 'base64').toString() const api = process.env.API_URL ? process.env.API_URL.replace(/\/$/, '') : '' const url = `${api}${decodedRequest}` // 仅发起一次请求,等待响应完成 const response = await got.get(url) // 等待JSON解析完成,拿到实际响应体 const body = await response.json() // 将headers转为可序列化的普通对象 const headers = JSON.parse(JSON.stringify(response.headers)) res.status(200).json({ headers: headers, data: body }) } catch (e) { // 完善错误处理,获取Got错误的详细信息 const statusCode = e.response?.statusCode || 500 res.status(statusCode).json({ error: e.message, statusCode, // 可选:返回错误响应的头信息 responseHeaders: e.response?.headers }) }
关键说明
- 单次请求:只调用一次
await got.get(url),获取完整的响应对象response,既可以拿到响应头,也可以从中解析响应体 - 异步JSON解析:必须用
await等待response.json()完成,确保拿到的是解析后的JSON数据而非Promise对象 - 错误处理优化:Got的错误对象包含
response属性,里面有错误响应的状态码、响应头等信息,能让你更精准定位问题 - 响应头处理:
JSON.parse(JSON.stringify(response.headers))是为了将Got返回的headers对象转为普通JSON对象,避免序列化时出现循环引用问题,Strapi的分页信息(如X-Total-Count)可以直接从response.headers中读取
内容的提问来源于stack exchange,提问作者Toni Michel Caubet
相关产品推荐
相关产品推荐

