无法设置未定义的属性“clientMutationId”

Posted

技术标签:

【中文标题】无法设置未定义的属性“clientMutationId”【英文标题】:Cannot set property 'clientMutationId' of undefined 【发布时间】:2016-02-23 05:59:14 【问题描述】:

我收到以下错误。尝试通过 graphiql 运行突变时。请帮助我解决此问题或指向我可以找到反应中继突变示例的链接。

mutation 
  createUser(input: username: "Hamza Khan", clientMutationId: "") 
    user 
      id
      username
    
  



  "data": 
    "createUser": null
  ,
  "errors": [
    
      "message": "Cannot set property 'clientMutationId' of undefined",
      "locations": [
        
          "line": 17,
          "column": 2
        
      ]
    
  ]

这里是突变定义

import 
  GraphQLString,
  GraphQLInt,
  GraphQLFloat,
  GraphQLList,
  GraphQLObjectType,
  GraphQLID,
  GraphQLNonNull
 from 'graphql';

import 
  connectionArgs,
  connectionDefinitions,
  connectionFromArray,
  fromGlobalId,
  globalIdField,
  mutationWithClientMutationId,
  nodeDefinitions,
 from 'graphql-relay';

import User from './usermodel';
import UserType from './usertype';

export const UserMutations = ;
UserMutations.createUser = mutationWithClientMutationId(
  name: 'CreateUser',
  inputFields: 
    username: type: new GraphQLNonNull(GraphQLString)
  ,
  outputFields: 
    user: 
      type: UserType,
      resolve: (payload) => 
        return User.getUserById(payload.userId);
      
    
  ,
  mutateAndGetPayload: (args) => 
    let newUser = new User( username: args.username );
    newUser.save().then((user) => 
      return userId: user.id;
    ).error((err) => return null;);
  
);

【问题讨论】:

该错误几乎可以肯定是因为您没有正确加载用户。可能是因为您只是将用户名作为输入发送。 我可以在 mutateAndGetPayload 中控制台登录新用户,但奇怪的是 outputFields 中的解析函数没有执行。 可能是您没有查询用户。如果您不请求字段,则不会调用输出字段的解析函数。 我正在使用两个字段 Id 和用户名查询用户。 您可以在为您的架构定义突变类型的位置添加代码吗?例如UserMutations.createUser 引用在哪里? 【参考方案1】:

你必须返回来自mutateAndGetPayload的东西——在你的情况下,一个承诺。

mutateAndGetPayload: (username) => 
  const newUser = new User(username);
  return newUser.save().then(user => (userId: user.id));

【讨论】:

此外,如果出现错误,我不确定您是否要返回空有效负载。您可能想要 throw 以便错误可以通过您的 webstack 冒泡并输出到 Relay,以便客户端突变可以知道突变已失败。 就我而言,我在返回的承诺中还有第二个承诺。第二个承诺被拒绝。这会导致再次出现错误“无法设置未定义的属性 'clientMutationId'”。不知道什么是最好的处理方式。 好吧,我的错。我的代码中有一个愚蠢的错误。回报在我承诺的“当时”之内。我没有从主流中返回。

以上是关于无法设置未定义的属性“clientMutationId”的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript - 无法设置未定义的属性

JavaScript - 无法设置未定义的属性

无法设置未定义 4 的属性“大小”

未捕获的类型错误:无法设置未定义的属性(设置“isSubcon”)

未捕获的类型错误:无法设置未定义的属性 [重复]

未捕获的类型错误:无法设置未定义的属性“索引”