我有一个流星发布功能,我在该发布功能中抛出一个错误,被订阅者捕获。我正在使用iron-router,而在'waitOn'函数中,我正在订阅该出版物。出于某种原因,当我从发布中抛出错误时,我的错误函数没有被调用,我不知道为什么。非常感谢帮助!
以下是我订阅的路线('assignmentsByGroup'
)和我的错误功能(onErrorfunction
):
this.route('assignmentsList',
{path: '/groups/:groupId',
waitOn: function() {
var onErrorfunction = function(error, result)
{
console.log("onErrorfunction called");
if(error)
{
console.log("Error!");
alert(error.reason);
}
};
return [Meteor.subscribe('assignmentsByGroup', this.params.groupId, onErrorfunction), Meteor.subscribe("groupById", this.params.groupId)];
},
data: function() {
return {
groupId: this.params.groupId
}
}
}
);
这是我的发布功能:
Meteor.publish("assignmentsByGroup", function(groupId)
{
try
{
if(_.contains(Groups.findOne({_id: groupId}).members, this.userId))
{
return Assignments.find({group: groupId});
}
else
{
var errorToThrow = new Meteor.Error(401, "Access denied: you cannot view assignments unless you are a member of this group.");
this.error(errorToThrow);
}
}
catch(err)
{
this.error(err);
}
});
答案 0 :(得分:4)
问题是我的onError回调语法。我向订阅方法传递了一个函数,该函数被解释为onReady函数,仅在发布函数中调用this.ready()时调用。我将Meteor.subscribe('assignmentsByGroup', this.params.groupId, onErrorfunction)
更改为Meteor.subscribe('assignmentsByGroup', this.params.groupId, {onError: onErrorfunction})
并且有效!此外,您仍然可以在发布函数中使用try和catch语句;无论是否有错误仍然可以正确抛出错误,但是使用它也可以捕获其他内部服务器错误。
答案 1 :(得分:0)
删除try / catch块。您已经在一个返回发布或错误的函数中。
当你执行try / catch时,你捕获的实际错误(一个Meteor.Error)被捕获并作为常规的javascript错误传递/抛出到catch中。
但订阅正在等待正确的Meteor.Error