You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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
  })
}

关键说明

  1. 单次请求:只调用一次await got.get(url),获取完整的响应对象response,既可以拿到响应头,也可以从中解析响应体
  2. 异步JSON解析:必须用await等待response.json()完成,确保拿到的是解析后的JSON数据而非Promise对象
  3. 错误处理优化:Got的错误对象包含response属性,里面有错误响应的状态码、响应头等信息,能让你更精准定位问题
  4. 响应头处理:JSON.parse(JSON.stringify(response.headers))是为了将Got返回的headers对象转为普通JSON对象,避免序列化时出现循环引用问题,Strapi的分页信息(如X-Total-Count)可以直接从response.headers中读取

内容的提问来源于stack exchange,提问作者Toni Michel Caubet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:50:28