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

级联两次脚本化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:27:27