Проблемы с типизацией при входе в Typescript - PullRequest
1 голос
/ 10 марта 2019

В настоящее время у меня возникла проблема с моим кодом входа в систему, где предполагается взять имя пользователя и пароль, найти соответствующий хэш в базе данных, сравнить их, подписать JWT и вернуть его, чтобы его можно было отправить обратнопользователь:

async login(username, password): Promise<boolean | void> {
// TODO: Fix typing.
//  Types the return as void currently - should return object.
//  No return at all either, however console.log prints result - check SO when you have time
const dbPwdHash = await this.userRepository.createQueryBuilder('user')
  .select(['user.password', 'user.id'])
  .where('user.username = :username', {username})
  .getOne();
return compare(password, dbPwdHash.password)
  .then(
    (res) => {
      if (res) {
        return sign({ id: dbPwdHash.id }, this.privateKey, { algorithm: 'ES512' }, (err, token) => {
          if (err) {
            return {err};
          } else {
            console.log(token);
            return {data: token};
          }
        });
      }
    },
  )
  .catch(
    (err) => {
      console.log(err);
    },
  );
}

Определения типа возвращаемые значения для сравнения и знака (от bcrypt и jsonwebtoken соответственно) по умолчанию аннулируются при использовании асинхронных функций с обещанием сравнения и сравнения.обратный вызов на знак.

Самая большая проблема, с которой я сталкиваюсь, это то, что в итоге ничего не возвращается, даже если console.log показывает, что пароль успешно сравнивается и JWT успешно подписывается.Я уверен, что это проблема с функцией знака, так как возврат результата из .then() в сравнении работает нормально, однако, как только я добавляю кодовый блок знака, ничего не возвращается.Однако я не уверен, что именно является причиной этого, а также как я должен соблюдать правила набора текста, когда сравнение возвращает <boolean | void>, а знак возвращает <string | void> afaik.

1 Ответ

0 голосов
/ 10 марта 2019

Вызов JWT.sign() с пропущенным обратным вызовом выполнит его асинхронно - это то, что вы делаете, это означает, что вызов вернет undefined, что вы и возвращаете.

Вы можете либо Обещать этот вызов, либо синхронно вызывать JWT.sign, который затем будет возвращен как Обещание блока compare(..).then(...).

Для "Обещания"этот обратный вызов ваш оператор возврата будет выглядеть примерно так:

return compare(password, dbPwdHash.password)
        .then(
            (res) => {
                if (res) {
                    return new Promise((resolve, reject) => {
                        sign({id: dbPwdHash.id}, this.privateKey, {algorithm: 'ES512'}, (err, token) => {
                            if (err) {
                                reject(err);
                            } else {
                                console.log(token);
                                resolve({data: token});
                            }

                        });
                    });
                }
                ;
            }
        )
        .catch(
            (err) => {
                console.log(err);
            },
        );

ссылка: https://github.com/auth0/node-jsonwebtoken#jwtsignpayload-secretorprivatekey-options-callback

...