Javascript 如何使用CASL使用JSON定义能力

Javascript 如何使用CASL使用JSON定义能力,javascript,casl,Javascript,Casl,我一直在阅读CASL库的文档,显然您可以使用JSON定义如下功能: 从'@casl/Ability'导入{Ability}; 导出默认新功能[ { 行动:“读”, 主题:“帖子” }, { 操作:“删除”, 主题:"帖子",, 条件:{已发布:true}, 倒过来:是的 } ] 但现在我正在尝试这样一个虚拟示例,但它不起作用,不确定原因: 从'@casl/Ability'导入{Ability}; const ability=新能力[{action:'read',subject:'article'

我一直在阅读CASL库的文档,显然您可以使用JSON定义如下功能:

从'@casl/Ability'导入{Ability}; 导出默认新功能[ { 行动:“读”, 主题:“帖子” }, { 操作:“删除”, 主题:"帖子",, 条件:{已发布:true}, 倒过来:是的 } ] 但现在我正在尝试这样一个虚拟示例,但它不起作用,不确定原因:

从'@casl/Ability'导入{Ability}; const ability=新能力[{action:'read',subject:'article'}]{ detectSubjectType:subject=>subject.subject } console.logability.can'read',{subject:'article'};//返回false
从4.0开始,CASL支持将类作为主题。由于此原因,在能力创建时为每个规则调用detectSubjectType,以检测主题的类型

在您的例子中,该函数只处理作为带有subject字段的对象传递的subject,但它也应该能够正确处理字符串

这里有两个选项:

检查subject是否是字符串,如果是,则按原样返回 const ability=新能力[{action:'read',subject:'article'}]{ detectSubjectType:subject=>typeof subject==='string'?subject:subject.subject } 使用默认DetectObject类型作为回退 从'@casl/Ability'导入{Ability,detectSubjectType}; const ability=新能力[{action:'read',subject:'article'}]{ detectSubjectType:subject=>subject和&subject.subject?subject.subject:detectSubjectTypesubject } 在第节中,文件说:

自定义检测函数必须返回字符串并处理以下情况:

当主语未定义时 当subject是字符串或函数时,应将其视为subject类型 当主体是客体时
如果您不想处理所有这些情况,可以回退到内置的detectSubjectType函数,该函数将为您执行此操作。

从4.0开始,CASL支持类作为主题。由于此原因,在能力创建时为每个规则调用detectSubjectType,以检测主题的类型

在您的例子中,该函数只处理作为带有subject字段的对象传递的subject,但它也应该能够正确处理字符串

这里有两个选项:

检查subject是否是字符串,如果是,则按原样返回 const ability=新能力[{action:'read',subject:'article'}]{ detectSubjectType:subject=>typeof subject==='string'?subject:subject.subject } 使用默认DetectObject类型作为回退 从'@casl/Ability'导入{Ability,detectSubjectType}; const ability=新能力[{action:'read',subject:'article'}]{ detectSubjectType:subject=>subject和&subject.subject?subject.subject:detectSubjectTypesubject } 在第节中,文件说:

自定义检测函数必须返回字符串并处理以下情况:

当主语未定义时 当subject是字符串或函数时,应将其视为subject类型 当主体是客体时
如果您不想处理所有这些情况,可以回退到内置的detectSubjectType函数,该函数将为您执行此操作。

奇怪的是,稍微调整一下,您的答案在ExpressJS中对我有用:let a=新功能规则;a、 detectSubjectType=subject=>{返回subject&&subject.subject?subject.subject:detectSubjectTypesubject;};奇怪的是,稍微调整一下,你的答案在ExpressJS中对我有效:let a=新能力规则;a、 detectSubjectType=subject=>{返回subject&&subject.subject?subject.subject:detectSubjectTypesubject;};