我从服务器/ 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中没有任何交易。但我至少需要向用户显示结果。
答案 0 :(得分:2)
答案 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.");
}
}
},
});