GraphQL,1-1关系突变

时间:2018-01-29 22:22:28

标签: node.js graphql graphql-js prisma prisma-graphql

我正在尝试使用NodeJS& amp;来实现我自己的GraphQL后端。 Prisma的。

目前,我只有两种简单类型:

用户:

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},
   })
}

但这不起作用,因为在创建User时,我省略了它的地址。我知道我应该在数据中添加一个具有此用户ID的地址字段,但因为我们正在创建它,所以我们现在无法访问它。如何解决这个问题? (我希望这可以在服务器中完成,如果可能的话,通过保持!和原子性,否则可以分成2个突变,如果这是诀窍?)。

最佳。

1 个答案:

答案 0 :(得分:0)

如果您不打算在创建新用户时始终提供地址,我建议您将地址字段设为可选。否则,无论您采取多少步骤以及执行速度有多快,总是潜在查询会返回错误的时刻。

TBH,我甚至不知道你为什么要这样做。我确定你可以不用,或者,如果它真的是强制性的,你应该宁愿"强迫"用户在注册时/之后填写此类详细信息。但是,仍然在架构中保持可选。

如果您在注册时询问地址信息,我看到它的方式,有两种方法可以解决。无论哪种方式,仍然会有一个解析器。并且,是的,您可以根据需要标记地址字段

  1. 如果您将地址与其他用户信息保存在同一文档中,那么事情是微不足道的,您只需在一个查询中将所有内容写入数据库即可。
  2. 如果 地址 用户 是单独的实体,仍然是一个解析器,但步骤更多参与其中你也可以通过两种方式解决这个问题:

    • 您保存用户,等待回复获取id,将user_id字段添加到地址,保存。保存地址后,您需要通过添加address_id字段来更新用户

    • 如果您正在使用 mongodb ,那么您完全没有理由不自行生成这些ID。使用new ObjectId(),在需要的地方添加,然后保存用户地址。这样您也可以返回乐观响应,或者等待两个操作完成。