【发布时间】:2021-10-14 07:02:26
【问题描述】:
我已经开始测试 prisma 2 和 graphql 以用于一个新的应用程序。我遇到了一个关于能够查询关系的显式多对多表的问题。
这是我的阿波罗模式:
scalar DateTime
type Query {
user(id: String!): User
users: [User]
spaces: [Space]
roles: [Role]
}
type Mutation {
createUser(id: String!, email: String!): User!
createSpace(name: String!): Space!
}
type User {
id: ID!
email: String!
spaces: [UserSpace!]
createdAt: DateTime!
updatedAt: DateTime!
}
type Space {
id: ID!
name: String!
users: [UserSpace!]
createdAt: DateTime!
updatedAt: DateTime!
}
type Role {
id: ID!
name: String!
description: String!
users: UserSpace
createdAt: DateTime!
updatedAt: DateTime!
}
type UserSpace {
id: ID!
user: User!
space: Space!
role: Role!
createdAt: DateTime!
updatedAt: DateTime!
}
这是我的棱镜架构:
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
// npx prisma migrate dev
// npx prisma generate
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model User {
id String @id
email String @unique
spaces UserSpace[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Space {
id Int @default(autoincrement()) @id
name String @unique
users UserSpace[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Role {
id Int @default(autoincrement()) @id
name String @unique
description String
users UserSpace[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model UserSpace {
id Int @default(autoincrement()) @id
user User @relation(fields: [userId], references: [id])
userId String
space Space @relation(fields: [spaceId], references: [id])
spaceId Int
role Role @relation(fields: [roleId], references: [id])
roleId Int
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
这是我的突变解析器:
const { prisma } = require(".prisma/client");
async function createUser(parent, args, context, info) {
return await context.prisma.user.create({
data: {
...args,
},
});
}
async function createSpace(parent, args, context, info) {
const isAuthenticated = context.authentication.isAuthenticated;
let role = null;
if(!isAuthenticated) {
throw new Error("Not Authenticated");
}
try {
role = await context.prisma.role.findUnique({
where: {
name: "Space Administrator",
},
});
}
catch(err) {
throw new Error(err);
}
return await context.prisma.space.create({
data: {
...args,
users: {
create: {
role: {
connect: { id: role.id },
},
user: {
connect: { id: context.authentication.auth0Id },
},
},
},
},
});
}
module.exports = {
createUser,
createSpace,
}
这是我的用户解析器(我知道这是问题所在,但我不知道如何解决问题):
function spaces(parent, args, context, info) {
return context.prisma.user.findUnique({ where: { id: parent.id } }).spaces();
}
module.exports = {
spaces,
}
基本上,当我创建空间时,用户被添加为空间管理员,然后应该能够使用以下内容进行查询:
query {
users {
id
email
spaces {
id
role {
name
}
space {
name
}
}
createdAt
}
}
但是,当我运行查询时,出现以下错误:
"message": "Cannot return null for non-nullable field UserSpace.role.",
在 prisma 2 中,我如何使用户的解析器使用显式的多对多表以及它如何在其中具有第三个关系?我是 prisma 和 graphql 的新手,所以如果还有其他突出的内容,我也想提供意见。
【问题讨论】:
标签: graphql apollo prisma resolver prisma2