文档中提到的 Keystone.js isAdmin var 不起作用

问题描述 投票:0回答:1

我目前正在开发一个 KeystoneJS 项目,并遇到了 TypeScript 的问题。我已经定义了一个访问控制函数 isAdmin,如 KeystoneJS documentation:

中所建议的那样
const isAdmin = ({ session }: { session: Session }) => session?.data.isAdmin;

但是,当我在 schema.ts 中的列表操作(创建、删除)的访问配置中使用此函数时,TypeScript 会抛出以下错误:

Type '() => boolean' is not assignable to type 'ListOperationAccessControl<"create" | "delete", TypeInfo<any>>'.
Types of parameters '__0' and 'args' are incompatible.
Type 'BaseAccessArgs<TypeInfo<any>> & { operation: "create"; }' is not assignable to type '{ session: Session; }'.
Property 'session' is optional in type 'BaseAccessArgs<TypeInfo<any>> & { operation: "create"; }' but required in type '{ session: Session; }'.

这是我的 schema.ts 的简化版本:

import { list } from "@keystone-6/core";
import type { Lists } from ".keystone/types";

type Session = {
  data: {
    id: string;
    isAdmin: boolean;
  };
};

const isAdmin = ({ session }: { session: Session }) => session?.data.isAdmin;

export const lists: Lists = {
  User: list({
    access: {
      operation: {
        create: isAdmin,
        delete: isAdmin,
      },
      // ... other access controls
    },
    fields: {
      // ... other fields
    },
  }),

  // ... other lists
};

此外,我发现有趣的是,node_modules/@keystone-6/core/src/access.ts 中的内置allowAll 函数仅返回true,工作时没有任何问题。

export function allowAll() {
  return true;
}

但是当我尝试对 isAdmin 执行同样的操作时,仍然不起作用。

function isAdmin() {
  return true;
}

我尝试使用有效的内置函数(allowAll)作为具有相同逻辑的本地函数(isAdmin)进行调试,但它仍然不起作用。

当我运行

npm run dev
时它仍然有效,但是当我运行
npm run test
时它不会。

npm run test 只是运行 jest。

javascript typescript keystonejs keystonejs6
1个回答
0
投票

您有两个不同的案例:

第一

const isAdmin = ({ session }: { session: Session }) => session?.data.isAdmin;

因为会话变量可以是“未定义”类型,所以你不能返回“未定义”,所以你需要放置一些东西来强制返回布尔值,例如:

const isAdmin = ({ session }: { session: Session }) => Boolean(session?.data.isAdmin);

第二个

function isAdmin() {  return true; }

您可以将该函数作为一般函数放在 access 中,但在特定操作中,您必须定义每个操作创建、查询等参数的类型

问候!

© www.soinside.com 2019 - 2024. All rights reserved.