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

