使用Yahoo-Fantasy库使用新刷新的访问令牌发出请求的最佳方法

时间:2020-11-03 13:49:37

标签: javascript node.js yahoo-fantasysports-api

我正在使用yahoo-fantasy库发出请求并从Yahoo接收数据。要向Yahoo请求,我们必须首先具有访问令牌。访问令牌会在1小时后过期,并且必须使用Yahoo刷新。刷新时,我们向Yahoo发送刷新令牌,Yahoo向我们发送新的访问令牌。

此库的作者具有内置功能,如果令牌过期,它将刷新令牌。刷新令牌后,可通过自定义回调访问新令牌信息,并在该回调中对其进行处理(持久化到数据库等)。问题在于它不尝试使用新令牌来发出原始请求。我希望它具有这种行为,因此每当我进行函数调用时,我都会收到正确的数据。

与刷新令牌有关的异步行为发生在模块的内部。因此,我不确定在调用回调后如何重试。

我的问题是:解决这个问题的最佳方法是什么?我尝试了两种可能的解决方案。

解决方案1-不要使用内置的刷新功能,请手动检查有效期

获取访问令牌后,将其与接收令牌的时间持久保存到数据库中

只要我们希望使用访问令牌,请确定它是否已过期(超过60分钟)

如果这样刷新并返回令牌

如果不返回预先存在的令牌

使用此访问令牌发出我们的请求

在发出请求之前检查有效期限,从而无需重试请求

解决方案2-允许回调设置访问令牌,在设置的时间后重试

允许回调作为局部变量与yahoo模块交互

调用回调时,设置新的访问令牌

1或2秒后重试初始请求(需要等待以确保已设置令牌)

const YahooFantasy = require('yahoo-fantasy');

const callback = (result) => {
  accessToken = result.access_token;
  yf.setUserToken(accessToken);
}

const yf = new YahooFantasy(
  clientKey,
  clientSecret,
  callback
);

yf.setUserToken(
  accessToken
);

yf.setRefreshToken(
  refreshToken
)

const delay = ms => new Promise(res => setTimeout(res, ms));

getGames = async () => {
  let data;
  try {
    data = await yf.user.games();
  } catch (err) {
    await delay(2000)
    data = await yf.user.games();
    console.log(data)
  }

}
getGames();

问题:

  • 想在回调返回令牌信息时重试,而不是等待任意时间
  • 不喜欢将回调与本地变量绑定在一起,这使得很难将回调重构到文件之外以供重用

我已经实现并正在运行解决方案1,但是我担心我可能没有充分利用该库已经提供的功能。

问题

  • 解决方案1是否是解决我的问题的有效方法?这是好习惯吗?
  • 在解决方案2中,是否有更好的方法将回调集成到我的解决方案中?我该如何设置它以便在收到令牌时重试请求,而不是等待设置的时间并假设已收到令牌?

0 个答案:

没有答案