突变是用于操作数据的查询。如果是这样,那么我的 root queryroot mutation 树应该看起来相似吧?他们都应该允许嵌套字段(嵌套突变)。我正在玩这个(使用 express-graphql )并且它有效。

例子:

// PUT /projects/:project_id/products/:id
mutation {
  findProject(id: 1) { // make sure that project exists and we can access it before mutating data
    updateProduct(id: 1, name: "Foo") { // the resolve function receives a valid `project` as the first argument
      id
    }
  }
}

这是一个有效的例子吗?突变应该像这样嵌套吗?如果不是,我应该如何处理嵌套资源?我找不到任何会改变嵌套资源的真实示例。所有示例仅在第一级(根突变上的字段)定义突变。

最佳答案

该产品具有唯一 ID,因此您只需识别它即可。

mutation {
  updateProduct(id: 1, name: "Foo") {
    id
  }
}

要验证用户是否有权修改产品,您应该检查产品的项目。无论如何,您可能会有一些集中授权:
resolve({ id }, { user }) {
  authorize(user, 'project', Product.find(id).project) // or whatever

  ... // update
}

旧答案:

这当然是一个有效的例子。

我猜想缺少嵌套对象突变示例可能是因为即使产品链接到项目,在大多数情况下它仍然具有唯一 ID——因此即使没有项目,您也可以找到该产品ID。

另一种选择是将项目 ID 作为 updateProduct 的参数包含在内:
mutation {
  updateProduct(projectId: 1, id: 1, name: "Foo") {
    id
  }
}

不过,您的解决方案对我来说似乎更好。

需要注意的是,突变实际上与查询完全相同。唯一的区别是 resolve 函数通常包含一些永久性更改,例如修改一些数据。尽管如此,突变的行为就像查询一样——验证参数、调用解析函数、返回声明类型的数据。

我们将这种方法声明为突变(而不是查询),以明确表示将要更改某些数据,但也是出于更重要的原因:修改数据的顺序很重要。如果您在一个请求中声明多个更改,执行程序将按顺序运行它们以保持一致性(但这并没有尝试解决分布式写入,这是另一个问题)。

关于rest - 嵌套资源上的 GraphQL 突变,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33564474/

10-11 07:01