调用服务器端方法

时间:2017-03-28 03:43:52

标签: javascript mongodb meteor

我从服务器/ 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);

      }
}

我想处理异常并在发生任何错误时抓住它并在frond-end中显示结果。我知道Meteor中没有任何交易。但我至少需要向用户显示结果。

2 个答案:

答案 0 :(得分:2)

你可以使用throw / catch。

阅读以下文件:

Throw

答案 1 :(得分:2)

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

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

这是一个例子。首先让我们看看抛出异常的流星方法。

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