Meteor.js:方法调用中没有在客户端上捕获错误

时间:2015-06-24 05:30:20

标签: javascript mongodb meteor coffeescript

我正在尝试在更新mongoDb中的文档时抛出用户定义的错误,如果在Method中发生任何错误。我正在调用方法并尝试捕获错误,但我没有得到一个。仅在服务器控制台中打印错误。我怎样才能在客户端发现错误?

我的代码示例如下:

//Method

     methodName: (userData) ->
        if(Meteor.isServer and this.userId)
          User.update {_id:this.userId},{$set:{username:userData.username, "profile.name": userData.name ,"emails.$.address": userData.email}}, (error) ->
            if error and error.code == 11000
              throw new Meteor.Error 403, 'Email already in used'




//client Side

        $meteor.call('methodName',result).then ((success) ->
                console.log success // is undefined in both case, when updates and in case of error
                if success
                  console.log 'data updated'

                ), (err) ->
                  console.log err // not entered in this region

2 个答案:

答案 0 :(得分:0)

您的代码存在一些误解

1)方法是同步调用。这意味着如果在触发错误之前它返回或完全运行,则不会在客户端上调用错误回调。

这意味着您需要始终使用同步代码。目前,您正在使用回调。

您可以改用此方法:

Meteor.methods methodName: (userData) ->
  if Meteor.isServer and @userId
    return User.update({ _id: @userId }, $set:
      username: userData.username
      'profile.name': userData.name
      'emails.$.address': userData.email)

这将抛出将在客户端上收到的错误,原因是#34;内部服务器错误"。作为一个“全能的”错误。您的代码之间的区别是没有回调。

您可以使用此语法使用try..catch模式捕获特定的重复键错误。

2)User.update {_id:this.userId}始终运行。您正在查找更新文档时出现重复键",11000错误。这不是执行此操作的最佳方法。您应该事先直接检查电子邮件。

3)方法应return一个值。目前,你没有任何回报。您只能使用一个结果,回调或检查方法返回的值。目前,您同时执行这两项操作,因此User.update的结果为undefined。这就是您看到undefined的原因。这应该有效:

Meteor.methods methodName: (userData) ->
  if Meteor.isServer and @userId
    if(User.emails.address':userData.email})) throw new Meteor.Error(500, "Email already exists");
    return User.update({ _id: @userId }, $set:
      username: userData.username
      'profile.name': userData.name
      'emails.$.address': userData.email)
  else return false

所以在这里你会直接检查使用过该电子邮件的用户并抛出错误&如果没有使用,请更新它。没有回调因此它应该在客户端上向Meteor.call返回一个值。

答案 1 :(得分:0)

您的代码存在大量错误。

Meteor.methods({

  methodName: function(userData){

    // you have to create the $set hash programatically first
    var setHash = {
      "$set": {
        "username": userData.username,
        "profile.name": userData.name,
        // what's going on here with the dollar sign you originally had?
        "emails.0.address": userData.email
      }
    };

    if( Meteor.isServer && this.userId() ){
      // It's Users, not User
      return Users.update( { _id: this.userId() }, setHash, function(error, numberOfAffectedDocuments){
        if(error && error.code == "11000"){
          // Error names have to be a string
          throw new Meteor.error("403", "Email already in use.");
        } else {
          return "Success! The number of affected documents is " + numberOfAffectedDocuments;
      });
    };

  }

});

// in your original code you never sent your Meteor Method any arguments when calling it
Meteor.call('methodName', userDataObject, function(error, result){
  if(error){
    console.log("there was an error: ", error);
  } else {
    console.log("method call was a success: ", result);
  };
});

参考文献:

http://docs.mongodb.org/manual/reference/operator/update/set/#set-elements-in-arrays

http://docs.meteor.com/#/full/meteor_user