在异步函数运行时定期获取身份验证令牌



我有一个authFetch函数,它获取令牌并在mongo和token变量中更新它。

const authFetch = async () => {
let authCollection = client.db("WheelPros_data").collection("auth");
TokenFromDB = await authCollection.find({ _id: 1 }).toArray();
({ accessToken: token, time: lastFetchedAuth } = TokenFromDB[0] || [{ accessToken: null, time: 0 }])
// console.log(new Date().getTime() / 1000 - lastFetchedAuth)
let axiosConfig = {
headers: {
"Content-Type": "application/json",
accept: "application/json",
},
};
await axios({
method: "POST",
data: {
userName: process.env.WHEELPROS_USERNAME,
password: process.env.PASSWORD,
},
url: `${process.env.PROD_API_URL}/auth/v1/authorize`,
axiosConfig,
})
.then(async (res) => {
const { accessToken } = res.data;
authCollection.updateOne(
{ _id: 1 },
{
$set: {
accessToken: accessToken,
time: new Date().getTime() / 1000,
Date: new Date(),
},
}, {
upsert: true
}
);
console.log("newAccessToken : ", accessToken)
token = await accessToken
console.log("inside token var = ", token)
console.log("------------------Auth Updated------------------");
})
.catch((err) => {
console.log("AXIOS ERROR: ", err);
});
}
await authFetch()
// console.log("ourside token var = ", token)
setInterval(authFetch, 3590000)

当我调用另一个异步函数来获取子模型时,会出现问题。1小时后,令牌过期,这就是为什么我们有setInterval函数来更新令牌,但它没有更新令牌,我收到403错误

下面是型号提取功能

const fetchSubmodels = async () => {
const modelDataFromDB = await collection
.find({ modelData: { $exists: true } })
.toArray();
console.log(modelDataFromDB.length)
modelDataFromDB.forEach(async (modeldata) => {
// await fetchToken().catch(console.error)
let dataSearch = modeldata.modelData.split(';')
await axios
.get(
`${process.env.PROD_API_URL}/${dataSearch[0]}/makes/${dataSearch[1]}/models/${dataSearch[2]}/submodels`,
{
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
}
)
.then(async function ({ data }) {
await collection.updateOne(
{ modelData: modeldata.modelData },
{
$set: {
submodels: data
},
}
);
// handle success
console.log(`pushing the submodels ${data} to ${modeldata.modelData} `)
})
.catch(async function (error) {
// handle error
console.log(error);
})
})
}
await fetchSubmodels()
clearInterval(authFetch)

任何见解都会有所帮助!

array.map一样,array.forEach不会将其调用的函数的结果await。在您的情况下,这意味着modelDataFromDB中每个条目的axios.get语句同步发送所有请求,而token仍然具有其原始值。(因此,如果它们及时到达后端,就永远不应该导致403。(

更重要的是,fetchSubmodelsawait没有任何作用,因此在发出所有这些请求后解析。在该时间点await fetchSubmodels()完成,因此几乎立即执行clearInterval(authFetch),并且setInterval没有效果。

虽然这还不能解释403条回复,但肯定不是你想要的。

如果更换

modelDataFromDB.forEach(async (modeldata) => {
...
})

带有

for (var modeldata of modelDataFromDB) {
...
}

请求将被连续发送,并且fetchSubmodels将等待最后一个请求的响应。

最新更新