Я использую промежуточное программное обеспечение для небольшого рефакторинга.
Вот процесс: каждый раз, когда приходит запрос, промежуточное программное обеспечение уровня маршрутизатора принимает и проверяет, существует ли JWT и не истек ли, если оно существует исрок действия не истек, прочитайте токен с сервера Redis, в противном случае запросите новый токен и сохраните его в Redis.
У меня есть два вопроса:
- Нижеприведенное промежуточное ПО просто обойдено, какя должен это исправить?
- Как выполнить асинхронный / ожидающий путь этого промежуточного программного обеспечения?
Промежуточное программное обеспечение:
const oAuthClient = require("../client/oAuthClient")
const redisClient = require("../client/redis")
module.exports = (req, res, next) => {
const cid = req.cid;
console.log(cid);
const existPromise = redisClient.existsAsync(cid)
const hgetPromise = redisClient.hgetAsync(cid, "expiration")
Promise.all([existPromise, hgetPromise]).then((redisReplies) => {
if (redisReplies[0] && (Number(redisReplies[1]) < new Date().getTime())) {
redisClient.hgetAsync(cid, "token").then((token) => {
req.jwt = token
})
} else {
oAuthClient.credentials.getToken().then((oAuthReplies) => {
const jwtToken = oAuthReplies.accessToken
const expirationIn = oAuthReplies.data.expires_in
const p1 = redisClient.hsetAsync(cid, 'token', jwtToken)
const p2 = redisClient.hsetAsync(cid, 'expiration', new Date().getTime() + Number(expirationIn))
Promise.all([p1, p2]).then(() => {
req.jwt = jwtToken
next()
})
})
}
}).catch((err) => {
next(err)
})
}
Обработчик маршрута:
router.get("/emailBot/:cid", getParams, getOauthToken, async (req, res, next) => {
const cid = req.cid
const jwtToken = req.jwt
try {
const apiUrl = process.env.EMAILBOTAPI
const XToken = process.env.EMAILBOTXTOKEN
console.log(apiUrl, XToken, jwtToken);
const apiResponse = await sendMessages.triggerApi(apiUrl, jwtToken, XToken, {
invocationContext: {
cid: cid
}
})
console.log(apiResponse);
} catch (error) {
next(error)
}
res.send({
message: "success"
})