Next JS with Prisma - 更新基于用户的角色
Posted
技术标签:
【中文标题】Next JS with Prisma - 更新基于用户的角色【英文标题】:Next JS with Prisma - Update User Based Roles 【发布时间】:2021-11-02 00:10:45 【问题描述】:我对 Next.js 和 Prisma 都很陌生。我正在开发一个管理市议会的应用程序,因此,该应用程序的管理员可以创建用户和角色并将角色分配给用户(即市议会员工)。
每个用户可以接收多个角色,并且这些角色可以更新,也就是说,管理员可以根据需要删除或分配更多角色给用户。
在我的数据库模式中,我有表 Customer
(又名 user,因为 user 是 postgresql 中的保留名称)、表 Role
和表 Customer_role
表示用户和他的关系 n:m角色。
使用 prisma 更新用户角色的最佳方式是什么?我现在就是这样做的:
const updateUser = async (req: NextApiRequest, res: NextApiResponse) =>
const
query: id ,
body: name, email, roles ,
= req as query: [key: string]: string ; body: any ;
try
await prisma.customer.update(
where: id ,
data: name, email ,
);
await updateUserRoles(id, roles);
const response = await prisma.customer.findUnique(
where: id: id ,
include:
customer_roles:
select:
role:
select:
id: true,
name: true,
,
,
,
,
,
);
res.status(200).json(response);
catch (error)
res.status(400).json((error as Error).message);
;
const updateUserRoles = async (userID: string, roles: id: string []) =>
try
await prisma.customer_role.deleteMany(
where:
customer_id: userID,
,
);
roles.map(async (role: id: string ) =>
await prisma.customer_role.create(
data:
customer_id: userID,
role_id: role.id,
,
);
);
catch (error)
throw new Error(error);
;
最初,我收到了一组我想分配给用户的角色,但是当我想更新它们时,我删除了所有当前用户角色,然后重新分配它们。这会产生一个错误,因为应该返回现在更新的用户及其新角色的响应对象没有等待函数updateUserRoles
,而是将用户角色作为空数组返回。只有当我刷新页面并再次获得用户时,这个错误才会得到修复。这是我的棱镜架构。
model role
id String @id @default(uuid())
@db.Uuid
name String @db.VarChar(255)
polls permission
news permission
events permission
work_orders permission
pharmacies permission
points_of_interest permission
subscription_events permission
customer_roles customer_role[]
created_at DateTime @default(now()) @db.Timestamptz(6)
updated_at DateTime? @default(now()) @db.Timestamptz(6)
@@index([name], name: "idx_role_name")
model customer_role
id String @id @default(uuid()) @db.Uuid
customer_id String @db.Uuid
role_id String @unique @db.Uuid
customer customer @relation(fields: [customer_id], references: [id], onDelete: Cascade)
role role @relation(fields: [role_id], references: [id])
model customer
id String @id @default(uuid()) @db.Uuid
name String @db.VarChar(255)
email String @unique @db.VarChar(255)
external_uuid String? @unique @db.Uuid
password String? @db.VarChar(255)
created_at DateTime @default(now()) @db.Timestamptz(6)
updated_at DateTime? @default(now()) @db.Timestamptz(6)
work_order_user work_order_user?
customer_roles customer_role[]
@@index([name], name: "idx_customer_name")
@@index([external_uuid], name: "idx_customer_external_uuid")
【问题讨论】:
【参考方案1】:您没有看到更新的角色的原因是因为您在 map
内的 updateUserRoles
函数下使用了 async
。这将异步运行,您将无法获得所需的响应,因为这将在后台运行。
更好的方法是使用upsert:
const updateUserRoles = async (userID: string, roles: id: string []) =>
try
await prisma.$transaction(
roles.map((role) =>
prisma.customer_role.upsert(
where: id: role.id ,
create: customer_id: userId, role_id: role.id ,
update: ,
)
)
)
catch (error)
throw new Error(error);
【讨论】:
以上是关于Next JS with Prisma - 更新基于用户的角色的主要内容,如果未能解决你的问题,请参考以下文章
Prisma with Next-Auth,用户创建失败导致Keycloak的api响应键名
graphql prisma node js postgresql如何将创建日期/更新字段添加到graphql类型?
next.js 中的 apollo-client 与 `next-with-apollo` VS next.js 文档常见问题解答中显示的方法(不使用 `getDataFromTree`)
无法生成 Prisma 客户端,outputDir.endsWith 不是函数
AWS Amplify 和 Next.JS with GraphQL Server Error No current user from getStaticPaths