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

Node.js使用Axios v0.21.1发送HTTPS GET请求时的异常问题及正确调用方法咨询

问题分析与解决方案

1. 第一段代码中console.log抛错但catch捕获的error为空的原因

你第一段代码里,await axios.get其实已经请求成功了,但执行JSON.stringify(getRes)时抛出了异常——因为Axios的响应对象(getRes)包含循环引用(比如getRes.config和响应主体之间的关联引用),JSON.stringify无法处理这种嵌套结构,所以会报错。而这个异常确实会被catch块捕获,但你又用JSON.stringify(error)去序列化错误对象,同样因为错误对象包含不可序列化的属性(比如堆栈信息、内部引用),导致最终输出为空。

解决这个问题很简单,换一种方式打印响应即可:要么直接打印getRes(浏览器/Node.js控制台会自动处理循环引用的展示),要么只序列化响应里的data字段(这部分是后端返回的纯数据,没有循环引用):

console.log("getRes:", getRes);
// 或者只看返回的业务数据
console.log("Response data:", JSON.stringify(getRes.data));

2. 第二段代码返回401 Unauthorized的原因

Axios的get方法签名是axios.get(url[, config]),它只有两个参数:第一个是请求地址,第二个是配置对象。你写成axios.get(myUrl, {}, {headers: ...})时,相当于把空对象作为合法配置,第三个参数直接被忽略了——这就导致请求根本没有带上Authorization头,后端自然返回401。这也是为什么Postman能成功(正确携带了头信息),但这段代码不行的核心原因。

3. 正确的Axios GET请求写法

GET请求默认不会携带请求体(Axios不会给GET请求自动添加请求体,除非你手动在配置里设置data属性),所以你不用担心请求体的问题。只需要把请求头正确放在第二个参数的配置对象里即可,写法和你第一段代码的结构一致:

try { 
  const getRes = await axios.get(myUrl, {
    headers: {
      'Authorization': `Bearer ${token}`
    }
  }); 
  console.log("Request success! Response data:", getRes.data);
} catch (error) { 
  // 打印错误时不要用JSON.stringify,直接打印error或访问它的属性
  console.log("Request failed:", error);
  // 还可以针对性打印错误的响应细节
  if (error.response) {
    console.log("Error status:", error.response.status);
    console.log("Error message:", error.response.data);
  }
}

你第三种写法(直接调用axios({method: 'get', ...}))本身是正确的,同样的问题出在后续用JSON.stringify序列化整个响应对象上,而非请求逻辑的错误。

额外排查点

如果确认请求头已经正确携带,但还是出现401,可以检查:

  • 确认token变量的值和Postman里完全一致(可以先打印token验证,避免拼写或空格错误)
  • 如果是在浏览器环境下,检查是否存在跨域问题(Postman不受浏览器CORS限制,而前端页面可能需要后端配置CORS允许携带自定义头)
  • 有些后端对Authorization头的格式要求严格,确认Bearer后面的空格没有遗漏(你的写法Bearer ${token}是正确的,但可以再核对)

内容的提问来源于stack exchange,提问作者User7723337

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 21:52:36