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

如何导出Promise中的set_cookies、csrf_token变量到其他JS文件

解决方案

核心问题说明

  1. Promise的resolve()方法仅支持传递1个参数,你同时传入set_cookies和csrf_token两个值,第二个参数会被默认忽略
  2. 你获取凭证的逻辑是异步网络请求,导出的内容是Promise实例,无法直接同步取值,必须通过.then()或async/await异步获取结果

GetSolManCredentials.js 修改

将两个返回值打包为对象传递,同时正确导出Promise:

// 此处保留你原有初始化request的逻辑不变
module.exports = new Promise(function(resolve, reject) {
   request.onload = () => {
      console.log(request.status);
      if (request.status == 200) {
        var cookies = request.getResponseHeader("set-cookie");
        var set_cookies = cookies[2];
        console.log("Cookies: " + set_cookies);
        var csrf_token = request.getResponseHeader("x-csrf-token");
        console.log("csrf token: " + csrf_token);
        // 打包为对象传递
        resolve({ set_cookies, csrf_token });
      } else {
        reject ("Something went wrong while getting cookies");
      }
    }
  });

如果需要按需发起请求(而不是引入文件时就自动发请求),可以封装为函数导出:

module.exports = function getSolManCredentials() {
  // 此处写你初始化request的逻辑,每次调用生成新请求
  return new Promise(function(resolve, reject) {
     request.onload = () => {
        console.log(request.status);
        if (request.status == 200) {
          var cookies = request.getResponseHeader("set-cookie");
          var set_cookies = cookies[2];
          console.log("Cookies: " + set_cookies);
          var csrf_token = request.getResponseHeader("x-csrf-token");
          console.log("csrf token: " + csrf_token);
          resolve({ set_cookies, csrf_token });
        } else {
          reject ("Something went wrong while getting cookies");
        }
      }
    });
}

Create.js 修改

对应直接导出Promise的场景

const credentialPromise = require("./GetSolManCredentials.js");

// 方式1:用.then()获取结果
credentialPromise.then(credentials => {
  const { set_cookies, csrf_token } = credentials;
  // 所有需要用到这两个值的业务逻辑都写在这里,或者传入其他函数调用
  console.log(set_cookies, csrf_token);
}).catch(err => {
  console.error("获取凭证失败:", err);
});

// 方式2:用async/await获取结果(推荐)
async function main() {
  try {
    const { set_cookies, csrf_token } = await credentialPromise;
    // 此处写业务逻辑
  } catch (err) {
    console.error("获取凭证失败:", err);
  }
}
main();

对应封装为函数导出的场景

const getCredentials = require("./GetSolManCredentials.js");

async function main() {
  try {
    const { set_cookies, csrf_token } = await getCredentials();
    // 此处写业务逻辑
  } catch (err) {
    console.error("获取凭证失败:", err);
  }
}
main();

原有方案失效原因

  1. 直接导出变量module.exports.csrf_token = csrf_token:导出动作执行时网络请求还未完成,csrf_token还是undefined,自然拿不到有效值
  2. 封装函数导出未成功:你没有处理Promise的异步特性,直接同步调用函数拿到的是Promise实例而非内部返回值,再加上之前resolve传了多个参数,只能拿到第一个值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:54:03