【问题标题】:How to return boolean from Meteor.call() to Accounts.findUserByEmail(email)如何从 Meteor.call() 返回布尔值到 Accounts.findUserByEmail(email)
【发布时间】:2016-07-27 18:05:42
【问题描述】:

我目前正在尝试通过电子邮件在 Angular 和 Meteor 中查找用户,并且在我的客户端代码上我正在使用 Accounts.findUserByEmail()。 在客户端上,我使用Meteor.call() 异步调用它。问题是我只能返回 console.log() 或 alert() 一个值,但我不能,例如 return truereturn false。我的客户没有读到它?

这是我的服务器端方法的预览:

checkUserByEmail : function (email) {

    this.unblock();

    check(email, Match.Any);
    console.log('Checking to see if ', email, 'is registered')
    var userEmail = Accounts.findUserByEmail(email);
    if(userEmail){
      console.log(userEmail + ' Email account is registered')
      return true
    }
    else{
      console.log(userEmail + ' Email account is not registered' )
      return false
    }
    return userEmail;
  }

然后在我的客户端某处:

    $scope.doesUserEmailExist = function(judge){
        Meteor.call('checkUserByEmail', judge.email , function(err, res){
            if(res){
                console.log(judge.email  + ' exists as a registered email!');
                alert('Judge is Valid')
                return true;
            }
            else if(err){
                console.log('Error ',judge.email , 'does not exist!');
                return false;
            }
        })
  }

我正在使用 $scope.doesUserEmailExist 通过在输入表单中输入电子邮件来查看用户是否已注册到我的应用程序。当我输入一个有效的电子邮件地址时,我得到一个 console.log 值,但我无法读取任何 return 值? 我希望我可以使用$scope.doesUserEmailExist(email) === true,但我没有成功运行它。

【问题讨论】:

    标签: angularjs meteor meteor-accounts angular-meteor


    【解决方案1】:

    我不知道这个Metor 但我想Meteor.call 正在向服务器发出异步请求,我认为你需要做$scope.doesUserEmailExist 函数返回一个承诺,试试这个:

    $scope.doesUserEmailExist = function(judge){
        var deferred = $q.defer();
        Meteor.call('checkUserByEmail', judge.email , function(err, res){
            if(res){
                console.log(judge.email  + ' exists as a registered email!');
                alert('Judge is Valid')
                deferred.resolve(true);
            }
            else if(err){
                console.log('Error ',judge.email , 'does not exist!');
                deferred.resolve(false);
            }
        })
        return deferred.promise;
    }
    

    然后看看是不是真的:

    $scope.doesUserEmailExist(email).then(function(response){
        response === true
    })
    

    不要忘记添加 $q 服务作为对控制器的依赖。

    Angular.$q

    【讨论】:

    • 您可以在resolve() 中传递res 而不是truefalse,或者您希望在回调函数中作为response 访问的任何内容。
    【解决方案2】:

    功能

    function(judge){
    

    到函数的时候已经完成了

    function(err, res){
    

    被执行。那是回电。您正在向调用回调的事物返回 false 和 true ......而不是原始函数。

    您可以调用一个函数来更新您需要更新的任何内容。或者更新某种反应变量(角度不太确定,因为我做更多的火焰/反应)

    【讨论】:

    • 好吧,我从函数内部得到了 console.log(judge.email + ' 作为注册电子邮件存在!')?所以我想知道为什么我没有得到返回值。
    • 是的,您可以随时打印到控制台.....也可以随时发出警报。如果您想查看发生了什么,请将 console.log("End of doesUserEmailExist") 放在 doesUserEmailExist 函数的末尾
    • 你会看到函数结束,然后回调会被调用
    【解决方案3】:

    所以我发现了问题所在。

    Meteor.call() 从服务器调用绑定到 Meteor 的 Accounts.findUserByEmail()running 的 checkUserByEmail 的方法。 服务器对客户端的调用只能 console.log 一个值而不能返回一个值,因为客户端没有纤程。

    所以解决方案是创建一个 Session 变量并将一个值绑定到它并在客户端返回该值。解决方案如下:

        $scope.doesUserEmailExist = function(judge){
        var exist = Meteor.call('checkUserByEmail', judge.email , function(err, res){
                    if(err){
                            console.log(err + ' ' + judge.email , 'does not exist!');
                            Session.set(judge.email, false);
                    }
            if(res){
                console.log(res + ' ' + judge.email  + ' exists as a registered email!');
                Session.set(judge.email, res);
            }
                    return Session.get(judge.email)
        })
            exist;
            console.log('Session is ' + Session.get(judge.email));
      }
    

    然后使用Session.get(variable) 在您的 Web 控制台中返回 Session 变量

    例如:console.log(Session.get('johnsmith@mayflower.com`)) //true

    *这仅适用于 Meteor *

    【讨论】:

      猜你喜欢
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      相关资源
      最近更新 更多