如何导出Promise中的set_cookies、csrf_token变量到其他JS文件
解决方案
核心问题说明
- Promise的
resolve()方法仅支持传递1个参数,你同时传入set_cookies和csrf_token两个值,第二个参数会被默认忽略 - 你获取凭证的逻辑是异步网络请求,导出的内容是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();
原有方案失效原因
- 直接导出变量
module.exports.csrf_token = csrf_token:导出动作执行时网络请求还未完成,csrf_token还是undefined,自然拿不到有效值 - 封装函数导出未成功:你没有处理Promise的异步特性,直接同步调用函数拿到的是Promise实例而非内部返回值,再加上之前resolve传了多个参数,只能拿到第一个值。
内容的提问来源于stack exchange,提问作者Mounir
相关产品推荐
相关产品推荐

