【问题标题】:Error handle in Meteor in calling server side method调用服务器端方法时 Meteor 中的错误句柄
【发布时间】:2017-03-29 17:57:26
【问题描述】:

我调用了一个从服务器/publicationMehods 中删除家庭的方法,如下所示:

    deletedFamily(family) {
      if (Meteor.user().roles[0] == "admin") {



         var myUsers = Meteor.users.find({"profile.family_id": family._id}).fetch();

         for (var i = 0; i < myUsers.length; i++) {
           UsersDeleted.insert(myUsers[i]);
           Meteor.users.remove(myUsers[i]);
          }

         var myGuests= Guests.find({"profile.family_id": family._id}).fetch();

         for (var i = 0; i < myGuests.length; i++) {
           GuestsDeleted.insert(myGuests[i]);
           Guests.remove(myGuests[i]);
          }

         FamiliesDeleted.insert(family);
         Families.remove(family);

      }
}

如果发生任何错误,我想处理异常并捕获它,并在前端显示结果。我知道 Meteor 中没有任何交易。但我至少需要向用户展示结果。

【问题讨论】:

    标签: javascript mongodb meteor


    【解决方案1】:

    在 Meteor 中,如果您想从 Meteor 方法向用户返回错误,那么您会抛出异常,但它必须是 Meteor.Error 异常对象才能将其发送回客户端。

    在客户端,当您在服务器上调用 Meteor 方法时,您提供了一个回调函数来接收错误和结果。如果您希望向用户显示错误,那么在方法中抛出的任何Meteor.Error 异常对象都将在error 回调参数中。

    这是一个例子。首先我们看一下meteor方法抛出异常。

    Meteor.methods({
      deletedFamily: function(family) {
        //... your logic here...
    
        if (somethingWentWrong) {
          throw new Meteor.Error("logged-out", "The user must be logged in to delete a family.");
        } else {
          return // something
        }
      },
    });
    

    在客户端,您可以像这样调用该方法,如果抛出错误,它将在 error 对象中。

    // on the client
    Meteor.call("deletedFamily", function (error, result) {
      // identify the error
      if (error && error.error === "logged-out") {
        // show a nice error message
        Session.set("errorMessage", "Please log in to delete a family.");
      }
    
      //...continue on with your logic...
    });
    

    如果您需要传递由其他东西(例如 mongodb)生成的异常,则只需使用 try/catch 块并在需要时传递 Meteor.Error。这是一个例子。

    Meteor.methods({
      deletedFamily: function(family) {
        //... your logic here...
    
        try {
          // Mongodb insert or update
        } catch(e) {
          if (e instanceof WriteError && e.code === '11000') {
            throw new Meteor.Error("duplicate-error", "The family already exists.");
          }
        }
      },
    });
    

    【讨论】:

    • 出了什么问题?它是 Meteor 中的已知属性吗?
    • 不,这只是一个愚蠢的例子,代表您将在逻辑中检查以确定需要抛出异常的任何内容。关键是,您的逻辑会知道何时发生错误,如果发生错误,您将抛出异常。
    • 谢谢。是的,这是我可以传递给客户的逻辑错误消息。但我不知道如何捕捉服务器端错误。比如重复键...
    • 我刚刚收到内部服务器错误 [500] 错误,当服务器因此错误而中断时:Exception while invoking method 'insertDeletedFamily' WriteError({"code":11000,"index":0,"errmsg":"E11000 duplicate key error collection: meteor.families_deleted index: _id_ dup key: { : \"DGG6H2v6CkGJNAHDg\" }","op":{"_id":"DGG6H2v6CkGJNAHDg","city":"*","address":"*","primary_contact":"*","primary_contact_phone":"*","smoking":"*",。我想处理这种错误
    • 听起来错误来自 mongodb,因为您违反了重复索引。您可以通过将try/catch 包裹在您的集合插入或更新发生这种情况的位置来处理此问题,捕获 mongodb 错误,然后为此抛出您自己的Meteor.Error
    【解决方案2】:

    你可以使用 throw/catch。

    阅读以下文档:

    Throw

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多