Meteor 集合拒绝规则属性未定义

Meteor 集合拒绝规则属性未定义,meteor,Meteor,在浏览器控制台中调用时: Meteor.users.update({u id:'2ma7ipq7btfxgm6r'},{$unset:{'profile.taskInProgress':''}) 此Meteor服务器代码给出了此错误 TypeError:无法读取未定义的属性“profile.taskInProgress” Meteor.users.deny({ 更新:函数(用户ID、文档、字段、修改器){ const tasks=['search','aSearch']; 返回(( 用户ID&&

在浏览器控制台中调用时:
Meteor.users.update({u id:'2ma7ipq7btfxgm6r'},{$unset:{'profile.taskInProgress':''})

此Meteor服务器代码给出了此错误

TypeError:无法读取未定义的属性“profile.taskInProgress”

Meteor.users.deny({
更新:函数(用户ID、文档、字段、修改器){
const tasks=['search','aSearch'];
返回((
用户ID&&
userId==Meteor.userId()&&

(tasks.indexOf(修饰符.$set['profile.taskInProgress'])>=0)|//我认为您有一个逻辑问题

你的表达基本上是这样的:

!(a && b && c || d)
c仅在执行$set时有效,d仅在执行$unset时有效

如果您的表达式是这样的(没有前缀bang):

…然后,对于$set,计算结果将是:a、b、c。如果这些都是真的,那么条件就满足了。它不需要继续计算d。这很好,因为我认为这将由于缺少空检查而失败

但是如果使用$unset,那么我相信c会失败,因为缺少空检查(这里我不是肯定的,但我认为这就是原因)

但是,您有一个完整的表达式“noted”。这将强制对a、b、c和d中的每一个进行求值,而不管使用的是$set还是$unset。由于缺少空检查,这将始终失败

我想你真正的意思是:

!(a && b && (c || d))
如前所述,您不能拥有用户标识,只要d为true(并且有空检查),您就可以允许该操作

为了解决这个问题,我会从整体逻辑上进行推敲

let userIdExists = !!userId;
let requesterIsLoggedInUser = (userId === Meteor.userId());
let progressSet = (modifier.$set && (tasks.indexOf(modifier.$set['profile.taskInProgress']) >= 0));
let progressUnset = (modifier.$unset && (modifier.$unset['profile.taskInProgress'] == ''));

let allowed = userIdExists && requesterIsLoggedInUser && (progressSet || progressUnset);

let denied = !allowed;

return denied;
在这样的逻辑情况下,我倾向于冗长,以确保每个条件都易于理解

顺便说一句,为什么这不表示为允许规则?在拒绝中返回“允许”而不是“!allowed”似乎更容易理解,imho

编辑:allow版本只是在最后执行一个“returnallowed;”,而不是处理denied变量


如果您正在尝试调试,请单击console.log()找出所有变量,看看它们是否符合您的期望。如果您愿意,请使用这些结果和修改器的控制台日志更新您的问题,以便更容易确认progressSet和progressUnset的逻辑。

配置文件中是否存在
taskInProgress
?确实存在。如果我注释掉“错误行”,它会起作用,但如果我这样做,那么我将失去对
$set
的权限。因此,现在看起来我可以拥有一个或另一个,但不能同时拥有两个。我的代码一定有问题。我在发布时尝试了你的代码,但它不允许访问。浏览器显示访问被拒绝。请显示允许的版本,我同意它更容易阅读。检查答案f或者编辑。我不确定它为什么不工作,所以一些console.log()将有助于调试。
!(a && b && (c || d))
let userIdExists = !!userId;
let requesterIsLoggedInUser = (userId === Meteor.userId());
let progressSet = (modifier.$set && (tasks.indexOf(modifier.$set['profile.taskInProgress']) >= 0));
let progressUnset = (modifier.$unset && (modifier.$unset['profile.taskInProgress'] == ''));

let allowed = userIdExists && requesterIsLoggedInUser && (progressSet || progressUnset);

let denied = !allowed;

return denied;