为什么Meteor.user()不在发布函数中工作?

时间:2015-01-23 09:48:59

标签: security meteor

主要是出于好奇,而且为了更好地理解Meteor安全性,Meteor.user()背后的原因是什么?在发布功能中不起作用?

1 个答案:

答案 0 :(得分:2)

原因在于这段代码(来自流星源代码)

Meteor.user = function () {
    var userId = Meteor.userId();
    if (!userId)
        return null;
        return Meteor.users.findOne(userId);
};
Meteor.userId = function () {
    // This function only works if called inside a method. In theory, it
    // could also be called from publish statements, since they also
    // have a userId associated with them. However, given that publish
    // functions aren't reactive, using any of the infomation from
    // Meteor.user() in a publish function will always use the value
    // from when the function first runs. This is likely not what the
    // user expects. The way to make this work in a publish is to do
    // Meteor.find(this.userId()).observe and recompute when the user
    // record changes.
    var currentInvocation = DDP._CurrentInvocation.get();
    if (!currentInvocation)
        throw new Error("Meteor.userId can only be invoked in method calls. Use   this.userId in publish functions.");
        return currentInvocation.userId;
};