Node.js Typescript登录函数类型问题

Node.js Typescript登录函数类型问题,node.js,typescript,nestjs,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 co

我目前的登录代码有问题,应该使用用户名和密码,在数据库中找到相应的哈希值,比较它们,签署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);
    },
  );
}
异步登录(用户名、密码):承诺{ //TODO:修复键入。 //将返回键入为void current-should return对象。 //也没有返回,但是console.log会打印结果-所以在您有时间的时候进行检查 const dbPwdHash=wait this.userRepository.createQueryBuilder('user')) .选择(['user.password','user.id']) .where('user.username=:username',{username}) .getOne(); 返回比较(密码,dbPwdHash.password) .那么( (res)=>{ 如果(res){ 返回符号({id:dbPwdHash.id},this.privateKey,{algorithm:'ES512'},(err,token)=>{ 如果(错误){ 返回{err}; }否则{ console.log(令牌); 返回{data:token}; } }); } }, ) .接住( (错误)=>{ 控制台日志(err); }, ); } 使用异步函数时,默认情况下,比较和签名返回的类型定义(分别来自
bcrypt
jsonwebtoken
)都是无效的,比较时使用承诺,签名时使用回调

然而,我遇到的最大问题是,即使
console.log
显示密码已成功比较,JWT已成功签名,最终也不会返回任何内容。 我确信sign函数有问题,因为它从比较中的
返回res。然后()
可以正常工作,但是只要添加sign代码块,就不会返回任何结果。但是,我不确定究竟是什么原因导致了这种情况,也不确定在比较返回值
而sign返回
afaik时,我应该如何遵守键入规则。

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

您可以提示该调用,也可以同步调用
JWT.sign
,然后将其作为
比较(…)的承诺返回。然后(…)

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

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);
            },
        );
引用:

调用
JWT.sign()
并传递回调将异步执行它-这就是您要做的,这意味着调用将返回
未定义的
,这就是您要返回的

您可以提示该调用,也可以同步调用
JWT.sign
,然后将其作为
比较(…)的承诺返回。然后(…)

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

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);
            },
        );

参考:

同步执行JWT.sign不会影响线程性能,即使它在compare返回的承诺范围内,如果我理解正确的话?此外,尝试使用.then来promisify JWT.sign根本不起作用,因为它声称.then不是stringcheck的属性。有关如何将回调转换为Promise@WolfSkin,请检查此项。我已使用示例编辑了有关如何转换为Promise的答案。如果它起作用,请告诉我,除了键入仍被破坏的事实之外,它是否有效(我可能不得不忽略它),它工作得非常好!@WolfSkin-太好了,我建议你稍微编辑一下你的问题,以便清楚这是jwt上呼叫标志的问题)-我想更多的人会遇到这个问题,不管使用什么类型的脚本。如果我理解正确的话,同步执行JWT.sign不会影响线程性能吗?即使它在compare返回的承诺范围内?此外,尝试使用.then来promisify JWT.sign根本不起作用,因为它声称.then不是stringcheck的属性。有关如何将回调转换为Promise@WolfSkin,请检查此项。我已使用示例编辑了有关如何转换为Promise的答案。如果它起作用,请告诉我,除了键入仍被破坏的事实之外,它是否有效(我可能不得不忽略它),它工作得很好!@WolfSkin-太好了,我建议你稍微编辑一下你的问题,以便清楚这是jwt上的呼叫标志的问题)-我假设更多的人会遇到这个问题,不管使用的是什么类型的脚本。