无法从 axios 响应中保存令牌(在不和谐机器人中)

问题描述 投票:0回答:1
var TOKEN = "";

async function getToken() {
  axios
    .post(url, data)
    .then((response) => {
      TOKEN = response.data.token;
    })
    .catch((error) => {
      console.log("failed to login");
    });
}

代码应该获取一个令牌,该令牌将用于进一步的请求,例如:

await getToken();
await getSomethingUsingToken();

但是令牌没有保存到变量中。 我也尝试过:

async function getToken() {
  let token;
  axios
    .post(url, data)
    .then((response) => {
      token = response.data.token;
    })
    .catch((error) => {
      console.log("failed to login");
    });
  return token;
}

代码是从 Discord 机器人调用的。

javascript node.js axios discord.js response
1个回答
0
投票

由于 axios 请求的异步特性,它没有被保存。在第二个示例中,您在 axios 的 Promise 解析之前返回令牌,因此它返回未定义。

要解决此问题,您可以使用异步/等待模式。所以修改 getToken 函数如下:

var TOKEN = "";

async function getToken() {
  try {
    const response = await axios.post(url, data);
    TOKEN = response.data.token;
    return TOKEN;
  } catch (error) {
    console.log("failed to login");
    throw error;
  }
}

通过此更改,当您使用await getToken()时,JavaScript将等待Axios请求完成,然后继续执行下一行,确保在继续getSomethingUsingToken之前更新TOKEN值。

当你调用该函数时,你可以这样做:

try {
  await getToken();
  await getSomethingUsingToken();
} catch (error) {
  console.log('There was an error.');
}

最后等待需要异步,因此如果事件处理程序位于不和谐的事件处理程序内,请确保事件处理程序是异步的

© www.soinside.com 2019 - 2024. All rights reserved.