@Nikita1244
Anonymous

Почему tokens.refreshToken — пустой?

Доброй ночи.
Столкнулся с странной проблемой.

У меня такой код в UserService:
const tokens = TokenService.generateTokens({...userDto}); // Эта функция для генерации токенов
await TokenService.saveToken(userDto.id, tokens.refreshToken); // Эта функция для сохранения в БД рефреш-токена


Вот коды этих функций:
async generateTokens(data) {
    const refreshToken = this.generateRefreshToken(data);
     const accessToken = this.generateAccessToken(data);
     return {
        refreshToken,
        accessToken
    }
}

async generateRefreshToken(data) {
    return jwt.sign(data, JWT_KEY_REFRESH, {expiresIn: "90d"});
}

async generateAccessToken(data) {
    return jwt.sign(data, JWT_KEY_ACCESS, {expiresIn: "15m"});
}
async saveToken(userId, refreshToken) {
    const TokenData = await TokenModel.findOne({user: userId})
    if (TokenData) {
        TokenData.refreshToken = refreshToken;
        console.log(TokenData)
        return TokenData.save();
    }
    const token = await TokenModel.create({user: userId, refreshToken});
    return token;
}


Получаю эту ошибку:
ValidationError: Token validation failed: refreshToken: Path `refreshToken` is required.
    at Document.invalidate (/home/nikita/nikitasavc-backend/node_modules/mongoose/lib/document.js:3123:32)
    at /home/nikita/nikitasavc-backend/node_modules/mongoose/lib/document.js:2911:17
    at /home/nikita/nikitasavc-backend/node_modules/mongoose/lib/schematype.js:1349:9
    at process.processTicksAndRejections (node:internal/process/task_queues:77:11)


Проверяю значение tokens.refreshToken перед функцией TokenService.saveToken()
undefined

Проверяю значение tokens:
Promise {
  {
    refreshToken: Promise {
      'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2ODEzMzgzNDMsImV4cCI6MTY4OTExNDM0M30.cPd9lQn4gQriyq4XVB9VrombG_11HGK7q0m_jU4P4hs'
    },
    accessToken: Promise {
      'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2ODEzMzgzNDMsImV4cCI6MTY4MTMzOTI0M30.D9mwm876fNpWsm_AI9FbMIT2AElyFiLDUnZUrAllEbM'
    }
  }
}

Вроде же все есть, но почему undefined? Подскажите, пожалуйста.
  • Вопрос задан
  • 118 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Aziret_Esengeldiev
Проблема здесь в том, что функции generateRefreshToken и generateAccessToken возвращают обещания (Promises), а не непосредственные значения. Поэтому когда вы обращаетесь к tokens.refreshToken, это возвращает Promis, которое не содержит реального значения, а лишь обещает его в будущем.

Можешь исправить это, дождавшись разрешения обещания, прежде чем передавать его в функцию saveToken. Вот как это можно сделать:

javascript
Copy code
const tokens = await TokenService.generateTokens({...userDto}); // Добавлено ожидание разрешения обещания
await TokenService.saveToken(userDto.id, await tokens.refreshToken); // Добавлено ожидание разрешения обещания перед передачей
Это обеспечит правильное получение значения рефреш-токена перед его передачей в функцию saveToken.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы