级联两次脚本化API请求时Token传递失败问题排查
问题排查:API请求级联时Token传递失败导致401错误
问题场景
尝试通过两次级联API请求检查端点可用性:第一个POST请求获取Token,将其传入第二个GET请求的Authorization头部。但第二个请求始终返回{"error": "Invalid token."}、401状态码及断言错误,尽管第一个请求已成功生成Token。
错误输出
{"error": "Invalid token."} 401 AssertionError [ERR_ASSERTION]: Expected 200 response
原代码
var assert = require('assert'); var request = require('request'); var options2,token,info; var options = { 'method': 'POST', 'url': '1', 'headers': { 'Content-Type': 'application/x-www-form-urlencoded' }, form: { 'client_id': '*', 'client_secret': '**', 'grant_type': 'client_credentials' } }; request(options, function (error, response) { if (error) throw new Error(error); info = JSON.parse(response.body); console.log(info.access_token); token=info.access_token; }); var request = require('request'); var options2 = { 'method': 'GET', 'url': '***', 'headers': { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token, } }; request(options2, function (error, response) { if (error) throw new Error(error); console.log(response.body); console.log(response.statusCode); assert.ok(response.statusCode == 200, 'Expected 200 response'); });
错误原因及修复
1. 异步执行顺序错误(核心问题)
request是异步函数,第一个请求的回调函数(负责赋值token)还未执行,第二个请求就已经被发起。此时token变量仍为undefined,导致Authorization头部变为Bearer undefined,触发无效token错误。
2. 冗余模块引入
重复执行var request = require('request');属于冗余操作,只需引入一次即可。
修复后的代码
将第二个请求的逻辑放入第一个请求的回调函数内部,确保token已成功获取后再发起请求:
var assert = require('assert'); var request = require('request'); var options = { 'method': 'POST', 'url': '1', 'headers': { 'Content-Type': 'application/x-www-form-urlencoded' }, form: { 'client_id': '*', 'client_secret': '**', 'grant_type': 'client_credentials' } }; request(options, function (error, response) { if (error) throw new Error(error); const info = JSON.parse(response.body); const token = info.access_token; console.log('获取到的Token:', token); // 打印Authorization头部值 const authHeader = 'Bearer ' + token; console.log('Authorization头部值:', authHeader); const options2 = { 'method': 'GET', 'url': '***', 'headers': { 'Content-Type': 'application/json', 'Authorization': authHeader } }; request(options2, function (error, response) { if (error) throw new Error(error); console.log(response.body); console.log(response.statusCode); assert.ok(response.statusCode == 200, 'Expected 200 response'); }); });
如何打印Authorization字段的值
有两种方式可以验证Authorization头部的内容:
- 发起请求前打印:在构建
options2后,直接打印options2.headers.Authorization - 请求回调中打印:在第二个请求的回调函数里,打印
response.request.headers.Authorization(查看实际发送的请求头部)
内容的提问来源于stack exchange,提问作者Salman
相关产品推荐
相关产品推荐

