在中间件中,我设置了一个访问用户的条件,即用户与经过身份验证的用户在同一个公寓中。该条件如下:can(DirectoryAction.VIEW,'DirectoryUser',{ roles:{ some:{ role:{ unitId:CASL_ROLE.unitId } }} }); DirectoryAction是一个枚举,包含查看、删除或更新等操作。DirectoryUser是我的用户对象的名称。CASL_ROLE是我为经过身份验证的用户角色指定的名称。将unitId视为设备ID。
编译时无异常,studio代码中检测到打字脚本错误。这是一个纯运行时错误:-->“equals”不支持数组和对象的比较
Prisma模式:
model DirectoryUser {
id BigInt @id @default(autoincrement())
userName String @map("user_name")
password String
roles DirectoryRoleUserMapping[]
@@map("directory_users")
}
model DirectoryRoleUserMapping {
id BigInt @id @default(autoincrement())
roleId BigInt @map("role_id")
role DirectoryRole @relation(fields: [roleId], references: [id], onDelete: Cascade, onUpdate: Cascade)
userId BigInt @map("user_id")
user DirectoryUser @relation(fields: [userId], references: [id], onDelete: Cascade, onUpdate: Cascade)
@@unique([roleId, userId])
@@map("directory_role_user_mappings")
}
model DirectoryRole {
id BigInt @id @default(autoincrement())
name String
unitId BigInt? @map("unit_id")
unit BmsUnit? @relation(fields: [unitId], references: [id], onDelete: Cascade, onUpdate: Cascade)
rank BigInt
users DirectoryRoleUserMapping[]
@@unique([name, unitId])
@@map("directory_roles")
}
将一个较不复杂的条件改为(仅此处的条件):{ roles:{ some:{ roleId:CASL_ROLE.id } } }不再抛出错误,但条件不再遵循规范。似乎每次我设置一个对象而不是一个配对密钥时:值在“some”中,则会显示此错误。例如,该条件:{ roles:{ some:{角色:{ id:CASL_ROLE.id } }} }抛出错误,但条件验证的内容与之前的相同。
如果需要,请咨询更多信息!谢谢你的注意!
1条答案
按热度按时间u3r8eeie1#
看起来你遇到了一个问题,'equals'不支持数组和对象的比较。这通常是一个问题,当你试图使用一个'等于'函数的对象或数组类型。在这里,看起来您试图使用CASL(公共访问安全层)的“some”函数进行比较,但它不支持您正在使用的对象复杂性级别。
一个可能的解决方案是将对象扁平化到比较简单的键值对的级别,而不是比较嵌套对象。还应确保比较的是相同类型的对象是否相等。错误消息似乎表明您正在将数组与对象进行比较,这将不起作用。
总之,确保你是在比较苹果和苹果(简单的键值对和简单的键值对),而不是苹果和桔子(数组和对象)。
我没有你的应用程序的完整上下文,但这里是示例prisma模式: