我正在尝试使用NodeJS和Prisma实现自己的GraphQL后端。
现在,我只有两种简单的类型:
用户:
type User {
id: ID! @unique
email: String!
address: Address! @relation(name:"UserAddress")
}
地址:
type Address {
id: ID! @unique
name: String!
user: User! @relation(name:"UserAddress")
}
和一个简单的突变,创建一个用户,可以通过以下方法解决:
async signup(parent, {email}, ctx, info) {
return ctx.db.mutation.createUser({
data: {email},
})
}
但这是行不通的,因为在创建用户时,我忽略了它的地址。我知道我应该在具有该用户ID的数据中添加一个地址字段,但是由于我们正在创建它,因此现在无法访问它。如何解决? (我希望在服务器中完成此操作,如果可能的话,请保持!和原子性,否则就可以分成2个突变)。
最好。
最佳答案
如果您不打算在创建新用户时总是提供地址,则建议您将地址字段设为可选。否则,无论您执行了多少步骤以及执行的速度有多快,潜在的查询总是会在某个时刻返回错误。
TBH,我什至不明白为什么您需要它。我确定您可以不用,或者,如果确实是强制性的,您应该宁愿“强制”用户在注册时/之后填写此类详细信息。但是,仍然在架构中将其保留为可选。
如果您是在注册时要求提供地址信息(按照我的方式查看),则有两种解决方法。无论哪种方式,仍然会有一个解析器。而且,是的,您可以根据需要标记地址字段
如果您将地址与其余用户信息保存在同一文档中,那么事情就变得微不足道了,您只需在一个查询中将所有内容都写入数据库即可。
如果“地址”和“用户”是分开的实体,则仍然是单个解析器,但是涉及更多步骤,您也可以通过两种方式进行处理:
您保存用户,等待响应获取id
,将user_id
字段添加到地址并保存。保存地址后,您需要通过添加address_id
字段来更新用户。
如果您使用的是mongodb,则绝对没有理由不自己生成这些ID。使用new ObjectId()
,在需要的地方添加它们,然后保存用户和地址。这样,您还可以返回乐观的响应,或者仅等待两个操作完成。
关于node.js - GraphQL,1-1关系突变,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48510990/