Typescript登录功能键入问题

时间:2019-03-10 17:38:14

标签: node.js typescript nestjs

我目前在登录代码时遇到问题,应该使用用户名和密码,在数据库中找到对应的哈希,进行比较,对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);
    },
  );
}

当使用异步函数并在比较中使用promise和在符号上进行回调时,默认情况下,类型定义的类型比较和符号的返回值(分别来自bcryptjsonwebtoken都是无效的)

但是,我遇到的最大问题是,即使console.log表明密码已成功比较且JWT已成功签名,最终也没有返回任何事实。 我肯定是sign函数存在问题,因为在比较中从.then()返回res可以正常工作,但是,一旦我添加了sign代码块,就什么也没有返回。但是,我不确定确切原因是什么,以及当比较返回a {{a1}}而符号返回<boolean | void>时我该如何遵守输入规则。

1 个答案:

答案 0 :(得分:0)

在传递了回调的情况下调用JWT.sign()将会异步执行它-这是您要做的,这意味着调用将返回undefined,这就是您要返回的内容。

您可以 Promisify 进行调用,也可以同步调用JWT.sign,然后作为compare(..).then(...)块的Promise返回。

为了“承诺”此回调,您的return语句应如下所示:

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