删除时出现中继错误:RelayMutationQuery:胖查询中的字段名称无效

Posted

技术标签:

【中文标题】删除时出现中继错误:RelayMutationQuery:胖查询中的字段名称无效【英文标题】:Relay Error when deleting: RelayMutationQuery: Invalid field name on fat query 【发布时间】:2016-05-11 23:30:42 【问题描述】:

我在尝试提交删除突变时遇到了问题。当我提交时,我收到错误Uncaught Invariant Violation: RelayMutationQuery: Invalid field name on fat query, `company`.。查看、创建和更新节点都可以工作。由于某种原因,我无法删除。它在 fatQuery 中提到了 company 字段,但我在 fat 查询中唯一的字段是我从服务器返回的 deletedUserId。提前致谢!

组件:

import React, Component from 'react';
import Relay from 'react-relay';
import Link from 'react-router';
import DeleteUserMutation from 'mutations/DeleteUserMutation';
import styles from './EmployeeItem.css';

class EmployeeItem extends Component 
  render() 
    const user = this.props;
    return (
      <div className=styles.employee>
        <p><strong>ID:</strong> user.id</p>
        <p><strong>First Name:</strong> user.firstName</p>
        <p><strong>Last Name:</strong> user.lastName</p>
        <p><strong>Email:</strong> user.email</p>
        <div className="btn-group">
          <Link to=`/company/employees/$user.id` className="btn btn-primary">View Employee</Link>
          <button onClick=this.handleRemove className="btn btn-danger">Delete User</button>
        </div>
      </div>
    )
  

  handleRemove = (e) => 
    e.preventDefault();
    const user, company = this.props;

    Relay.Store.commitUpdate(new DeleteUserMutation(user, company));
  ;


export default Relay.createContainer(EmployeeItem, 
  fragments: 
    company: () => Relay.QL`
      fragment on Company 
        id
        $DeleteUserMutation.getFragment('company')
      
    `,
    user: () => Relay.QL`
      fragment on User 
        id
        firstName
        lastName
        email
        $DeleteUserMutation.getFragment('user')
      
    `
  
);

变异:

import React from 'react';
import Relay from 'react-relay';

export default class DeleteUserMutation extends Relay.Mutation 
  static fragments = 
    company: () => Relay.QL`
      fragment on Company 
        id
      
    `,
    user: () => Relay.QL`
      fragment on User 
        id
      
    `
  ;

  getMutation() 
    return Relay.QL`mutation deleteUser`;
  

  getFatQuery() 
    return Relay.QL`
      fragment on DeleteUserPayload 
        deletedUserId
      
    `;
  

  getVariables() 
    return 
      id: this.props.user.id,
    
  

  getConfigs() 
    return [
      type: 'NODE_DELETE',
      parentName: 'company',
      parentID: this.props.company.id,
      connectionName: 'employees',
      deletedIDFieldName: 'deletedUserId'
    ]
  

  // Wasn't sure if this was causing the error but it appears to be 
  // something else.
  // getOptimisticResponse() 
  //   return 
  //     deletedUserId: this.props.user.id
  //   
  // 

【问题讨论】:

【参考方案1】:

此错误是指您在getConfigs() 实现中引用了“公司”这一事实。 NODE_DELETE 配置告诉 Relay 如何通过将存储中的节点(例如 parentID)映射到胖查询上的字段(例如 parentName)来构造变异查询。

虽然您今天可能不一定需要它,但您应该在此处将 company 添加到突变有效负载和胖查询中,因为公司受到此更改的影响。更具体地说,正在修改公司的员工连接:)

【讨论】:

这解决了我的问题。我在根字段中添加了一个 globalId(在我的例子中是一个名为“verify”的对象),并且我还在服务器上更改了我的突变以返回一个边,而不仅仅是底层类型。我还将根“验证”对象添加到突变输出字段中:客户端的中继突变需要知道哪个对象拥有连接,将新边缘放在哪里是有意义的。【参考方案2】:

NevilleS 的解决方案为我解决了这个问题:

我在根字段中添加了一个 globalId(在我的例子中是一个名为“verify”的对象),我还在服务器上更改了我的突变以返回一个边,而不仅仅是底层类型。我还在突变输出字段中添加了根“验证”对象:客户端的中继突变需要知道哪个对象拥有连接,将新边放在哪里是有意义的。

export const Verify = new GraphQLObjectType(
name: 'Verify',
fields: () => (
  id: globalIdField('Verify'),
  verifications: 
    args: connectionArgs,
    type: VerificationConnection,
    resolve: (rootValue, args) => connectionFromArray(rootValue.verifications, args)
  ,

在突变的输出字段中添加“verify”和“verificationEdge”。

export const AddVerifiedSchool = mutationWithClientMutationId(
name: 'AddVerifiedSchool',
inputFields: 
  verification: 
    type: VerifiedSchoolInput
  
,
outputFields: 
  success: 
    type: GraphQLBoolean,
    resolve: () => true
  ,
  verificationEdge: 
    type: VerificationEdge,
    resolve: (verification, context) => 
      console.log('verification', verification);
      return verification
    
  ,
  verify: 
    type: Verify,
    resolve: (verification, context) => 
      return context.rootValue
    
  
,

将验证字段添加到胖查询中,并将(来自verify的globalId“id”)添加到片段中,并使用新的globalId来标识连接所在的节点。

static fragments = 
  verify: () => Relay.QL`fragment on Verify  id `,
  action: () => Relay.QL`fragment on Action  name url `
;

getConfigs() 
  return [
    type: 'RANGE_ADD',
    parentName: 'verify',
    parentID: this.props.verify.id,
    connectionName: 'verifications',
    edgeName: 'verificationEdge',
    rangeBehaviors: 
      '': 'append'
    
  ];


getFatQuery() 
  return Relay.QL`
  fragment on AddVerifiedSchoolPayload 
    verification 
      $VerifiedSchool.getFragment('verification')
    
    verify 
      id
    
  `

【讨论】:

以上是关于删除时出现中继错误:RelayMutationQuery:胖查询中的字段名称无效的主要内容,如果未能解决你的问题,请参考以下文章

中继可变参数模板参数时出现 Visual Studio 错误 [重复]

尝试从反应应用程序连接到 graphcool 中继 API 时出现此错误:模块构建失败:错误:没有有效的 GraphQL 端点

为啥在 Qt 中继承 QWidget 类时出现内存泄漏

删除时出现分段错误

XMPPFramework - 删除注册用户帐户时出现“未授权”错误

删除模板数组时出现分段错误[重复]