【问题标题】:I need Loopback remote method to return null我需要 Loopback 远程方法返回 null
【发布时间】:2018-11-19 23:25:18
【问题描述】:

所以我正在学习 NodeJs 的 Loopback,我正在尝试使用 bcrypt lib 进行身份验证。 如果找不到用户或密码不匹配,我需要我的登录远程方法返回空值。

我的登录实现是:

 User.login = function(username, password,cb){
        User.findOne({where:{username: username}}, function(err, user){
            cb(null, user);
            console.log(JSON.stringify(user));

            if(user === null){
                console.error('User not found');
                return null;
            }

            console.log('User found');

            if(!bcrypt.compareSync(password, user.password)){
                console.error('Illegal Password');
                user = null;
                console.log('USER SHOULD BE NULL =======>   '+JSON.stringify(user));
                return user;
            }
            console.log('User Authenticated');

            return user;
        });
    }

实际上,如果找到用户,则应为 null 的 console.log 实际上为 null,但是在 auth.service 函数中,如果密码不匹配,则应接收 null 值,但它确实接收了用户。

 login(username: string, password: string) {

    return this.http.post(this.configService.apiUrl + '/users/login', { username: username, password:password })
      .pipe(map(user =>{

        console.log('AUTHSERVICE USER SHOULD BE NULL  ===========>  '+ JSON.stringify(user));
        
        //THIS USER IS NEVER NULL IF USER IS FOUND!!! EVEN IF PASSWORD IS NOT MATCHED

        if(!user || user === null){
          console.error('Invalid credentials');
          return;
        }
      

          sessionStorage.setItem('currentUser', JSON.stringify(user));
          this.loggedIn.next(true);
          this.router.navigate(['/']);
          return user;
    
      }));
      }

我确定我在这里遗漏了一些东西,任何帮助将不胜感激。 谢谢。

【问题讨论】:

  • 什么是cbUser.login 的 3d 参数)?怎么调用User.login方法?
  • cb 是远程方法在 LoopBack 中使用的回调函数。 login方法由它的api端点调用:this.configService.apiUrl + '/users/login'

标签: javascript node.js loopbackjs


【解决方案1】:

请注意,LoopBack 远程方法是异步的,因此结果必须通过第二个回调参数传递,而不是作为返回值。

 User.login = function(username, password,cb){
    User.findOne({where:{username: username}}, function(err, user){
        // ** DON'T FORGET TO HANDLE ERRORS **
        if (err) return cb(err);

        console.log(JSON.stringify(user));

        if(user === null){
            console.error('User not found');
            // ** THE FIRST ARG IS "error", THE SECOND ARG IS "result"
            cb(null, null);
        }

        console.log('User found');

        if(!bcrypt.compareSync(password, user.password)){
            console.error('Illegal Password');
            user = null;
            console.log('USER SHOULD BE NULL =======>   '+JSON.stringify(user));
            return cb(null, null);
        }
        console.log('User Authenticated');

        cb(null, user);
    });
}

解释你观察到的行为:在你的登录实现中,你总是返回findOne找到的用​​户,见这里:

    User.findOne({where:{username: username}}, function(err, user){
        cb(null, user);

        // none of the code below matters, because the result
        // has been already set via `cb(null, user)`
    }

【讨论】:

  • 太棒了!!!!我一直在努力弄清楚何时使用回调函数。即使下面的代码运行,它对结果没有影响。谢谢你的解释。
  • 乐于助人 :) 如果您在 Node.js 8.x 或更高版本上运行,请考虑使用异步函数和 await 语句而不是回调。就我个人而言,我发现 async/await 更容易阅读、编写和推理。大多数 LoopBack API 已经启用了 promise/await,因此您可以例如写await User.findOne({/*...*/}),远程方法也可以返回一个promise,即你可以把它们写成异步函数(User.login = async function //...)。祝你的项目好运!
猜你喜欢
  • 2016-10-24
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 2012-12-19
相关资源
最近更新 更多