提交突变后 Apollo 数据对象为空

Posted

技术标签:

【中文标题】提交突变后 Apollo 数据对象为空【英文标题】:Apollo data object is empty after sumbit a mutation 【发布时间】:2020-01-09 01:53:10 【问题描述】:

我目前正在使用 apollo 在我的项目上进行传输(添加用户),并且当响应时我的对象数据为空。你知道为什么吗?

这是我的架构类型

  type UserKyrios 
    _id: ObjectId!
    firstname: String!
    lastname: String!
    email: String!
    password: String!
    creationDate: Date
  
`;

这是我的输入类型

  input UserKyriosInput 
    firstname: String!
    lastname: String!
    email: String!
    password: String!
  
`;

定义类型变异

  type Mutation 
    upsertUserKyrios(user: UserKyriosInput!): UserKyrios
  

我的查询突变

mutation UpsertUserKyrios($user: UserKyriosInput!) 
    upsertUserKyrios(user: $user) 
        ...userKyriosFields
        creationDate
    
  

我的输出

data: upsertUserKyrios: null
upsertUserKyrios: null

我的解析器

upsertUserKyrios: async (_, __,  server ) => server.plugins.mongodb.UserKyrios.insertOne(),

我的脚本组件

<script>
import  UPSERT_USER_KYRIOS  from '../../../../graphql/KyriosMutations';

export default 
  name: 'addUserModalComponent',
  props: 
    dialog: 
      type: Boolean,
      default: false,
    ,
  ,
  data: () => (
    user: 
      firstname: '',
      lastname: '',
      email: '',
      password: '',
    ,
  ),
  methods: 
    closeDialog() 
      this.$emit('closeModal');
    ,
    async submitForm() 
      const userCreated = await this.$apollo.mutate(
        mutation: UPSERT_USER_KYRIOS,
        variables: 
          user: this.user,
        ,
      );
      console.log(userCreated);
    ,
  ,
;
</script>

【问题讨论】:

【参考方案1】:

发生错误时,数据返回空。您需要寻找完整的回复。那里可能存在错误。

不确定 this.$apollo.mutate 来自哪里,但 mutate 通常会返回一个承诺。

使用它们的一个好方法是使用钩子:https://www.apollographql.com/docs/react/essentials/mutations/

【讨论】:

【参考方案2】:

解析器为您提供有关请求的一些信息:

第一个参数:父母

第二个参数:args => 包含请求负载

3d 参数:上下文

第四个参数:信息

突变数据存在于您不使用的第二个参数(args)中。 args 将包含一个对象。在您的情况下,user 带有来自客户端请求的值。 ($变量)。

upsertUserKyrios: async (_, args,  server ) =>

在客户端:

当您提交表单时,在可验证对象 (UserKyriosInput) 中发送所有必要的信息

variables: 
  user: 
    firstname: this.user.firstName
    lastname: this.user.lastName
    email: this.user.email
    password: this.user.password
  

variables: 
  user: 
    ...this.user
  

希望有意义。

【讨论】:

【参考方案3】:

您的解析器似乎缺少信息。解析器中的第二个参数似乎没有处理来自字段的任何传入数据。另外,一旦出现这些参数,可能我对 Mongo 的了解还不够,但是您不应该将要插入的数据作为对象发送到 insertOne 函数中吗?

我们还应该看看你的 gql 定义是什么样的。

【讨论】:

我添加了这样的用户变量,但它不起作用 upsertUserKyrios: async (_, user , server ) => server.plugins.mongodb.UserKyrios.insertOne(user), 您肯定需要传递某种数据作为第二个参数。它应该像你在那里一样。在解析器中使用 console.log(user) 来验证数据是否到达那里并不是一个坏主意。如果不是,您可能错误地定义了突变。如果您还可以更新您的原始帖子以包含 import UPSERT_USER_KYRIOS from '../../../../graphql/KyriosMutations'; 实际导入的内容会很棒。 我认为问题在于我的突变声明,因为当我删除解析器时,我得到了相同的东西...... 这就是我们的意思。在您的问题中,没有足够的信息来确定去哪里。需要对数据流向的位置进行更多调试。

以上是关于提交突变后 Apollo 数据对象为空的主要内容,如果未能解决你的问题,请参考以下文章

Vuex 状态随突变而变化 - apollo graphql 查询

使用突变响应更新 apollo 客户端

使用 Apollo 执行突变后如何更新单独的组件道具

React Apollo 客户端多个突变

Apollo GraphQL 突变(对象参数)

使用 MockedProvider 进行测试时使用 Apollo 突变更新存储