Discord Bot中无法从Axios响应保存Token的问题
问题根源
你遇到的问题核心是异步操作未被正确等待:
- 你的
getToken是async函数,但内部调用axios.post时没有用await等待Promise完成,而是用了.then回调。这会导致函数直接返回,.then里的赋值操作要等到HTTP请求结束后才会执行,而此时外部的await getToken()已经执行完毕,后续的getSomethingUsingToken自然拿不到Token。 - 第二种写法里,
return token的语句会在axios.post的回调执行前就运行,所以返回的是初始的undefined。
解决方案
方案1:用async/await替代.then回调(推荐)
这种写法更直观,符合async函数的设计逻辑:
var TOKEN = ""; async function getToken() { try { // 等待axios请求完成 const response = await axios.post(url, data); TOKEN = response.data.token; } catch (error) { console.log("failed to login"); // 可按需添加错误处理,比如抛出错误让调用者感知 // throw new Error("Login failed: " + error.message); } } // 调用方式不变 await getToken(); await getSomethingUsingToken();
方案2:让getToken返回Promise(如果坚持用.then)
如果一定要保留.then写法,需要让getToken返回axios的Promise,这样外部的await才能等待请求完成:
var TOKEN = ""; function getToken() { // 返回axios.post的Promise return axios.post(url, data) .then((response) => { TOKEN = response.data.token; }) .catch((error) => { console.log("failed to login"); }); } // 调用方式不变 await getToken(); await getSomethingUsingToken();
方案3:返回Token而非全局变量(更优雅)
全局变量容易引发意外问题,推荐直接返回Token给调用者:
async function getToken() { try { const response = await axios.post(url, data); return response.data.token; } catch (error) { console.log("failed to login"); return null; // 或抛出错误让调用者处理 } } // 调用时接收Token const token = await getToken(); if (token) { await getSomethingUsingToken(token); }
内容的提问来源于stack exchange,提问作者Igor Velikopopovetsky
相关产品推荐
相关产品推荐

