错误:不知道如何处理这种类型的突变。突变不遵循命名约定

Posted

技术标签:

【中文标题】错误:不知道如何处理这种类型的突变。突变不遵循命名约定【英文标题】:Error: Do not know how to handle this type of mutation. Mutation does not follow naming convention 【发布时间】:2020-12-23 05:54:00 【问题描述】:

使用GRANDstack Starter 模板项目,我将apollo-server 与neo4j 结合使用。我有一个 CreateParticipant 突变(在带有 @cypher 指令的 schema.graphql 中定义),我想将其重用于新的突变。

传递到增强模式的简化解析器如下所示:

const resolvers = 
  Mutation: 
    UploadCSV: async (parent,  file , context, info) => 
      // some data processing using file omitted
      const payload =  name: 'Just a name' 
      const result = resolvers.Mutation.CreateParticipant(
        parent,
        payload,
        context,
        info
      )
      return 'thanks ***'
    ,
  ,

突变在 schema.graphql 文件中定义如下:

CreateParticipant(name: String!, id: ID = null): Participant
@cypher(
  statement: """
  CREATE (par:Participant 
    name: $name,
    id: coalesce($id, apoc.create.uuid())
  )
  RETURN par
  """
)

UploadCSV(file: Upload!): String

当我现在尝试通过前端上传文件时,apollo-server 在执行resolvers.Mutation.CreateParticipant(parent, payload, context, info) 时抛出错误。 Payload 是一个具有突变所期望的键/值对的对象。

抛出的错误是:

错误:不知道如何处理这种类型的突变。突变确实 不遵循命名约定。

我想知道传递未修改的 info 是否是这不起作用的原因。

【问题讨论】:

您是否尝试过缩小 UploadCSV csv 中抛出的哪些函数?这样你就可以排除graphql配置设置vs csv读取,vs创建参与者变异代码?还有你不等待函数 csvToParticipant 的原因吗?这将有助于清理此代码并使其更具可读性。 @EdwardRomero 好点。我简化了这个例子。该函数实际上做了它应该做的事情。我用一些硬编码数据对其进行了简化。 看起来 neo4j-graphql.js 库正在尝试处理 UploadCSV 解析器,而不是使用您的自定义解析器。尝试在 trypedefs 中添加 @neo4j_ignore 指令,以确保它不会尝试运行自动生成的解析器 UploadCSV(file: Upload!): String @neo4j_ignore @WilliamLyon 感谢您的建议。我也试过这个。同样的错误。 【参考方案1】:

不要试图在另一个内部调用突变。而是将创建参与者逻辑拉出并导入通用函数。这允许您在上传 csv 和创建参与者突变之间保持关注点的分离。

一些不错的资源:

Nested Graphql Resolvers

Reusing Resolvers Conversation

【讨论】:

CreateParticipant 突变本身是最小可行函数。它通过 cypher 指令在模式中实现。在这种情况下,在 UploadCSV 突变中重用所述突变是有意义的,因为我在这里所做的只是转换上传的数据,以便它可以用于之前的书面突变(仍在其他地方使用)。 @manonthemat gotcha,您能否提供创建参与者架构定义,以便我们了解全局 添加了 CreateParticipant 突变。我想知道我的 info 对于 CreateParticipant 是否有误。 @manonthemat 所以似乎重用解析是不常见的spectrum.chat/apollo/apollo-server/… 并且人们倾向于通过我最初在回复中提到的方法。但是如果你还想做的话,这里可能有办法spectrum.chat/apollo/apollo-server/…

以上是关于错误:不知道如何处理这种类型的突变。突变不遵循命名约定的主要内容,如果未能解决你的问题,请参考以下文章

如何处理阿波罗客户端上的突变错误?

阿波罗突变“在这种环境中,分配的来源必须是一个对象”

如何处理 graphQL 突变中的 Union 或 Interface?

如何处理 GraphQL 中的嵌套输入

CQRS 命令和 GraphQL 突变

Apollo 客户端突变错误和更新组件