Мутация на стороне клиента с типом RANGE_ADD не включает ребро внутри полезной нагрузки запроса.

Я пытаюсь создать новый объект, используя описанную ниже мутацию на стороне клиента:

import Relay from 'react-relay'

export default class CreateThemeMutation extends Relay.Mutation {

  static fragments = {
    admin: () => Relay.QL`fragment on Admin { id }`,
  };

  getMutation() {
    return Relay.QL`mutation { createTheme }`
  }

  getFatQuery() {
    return Relay.QL`
      fragment on CreateThemePayload {
        admin { themes }
        themeEdge
      }
    `
  }

  getVariables() {
    return {
      name: this.props.name,
    }
  }

  getConfigs() {
    return [{
      type: 'RANGE_ADD',
      parentName: 'admin',
      parentID: this.props.admin.id,
      connectionName: 'themes',
      edgeName: 'themeEdge',
      rangeBehaviors: {
        '': 'append',
      },
    }]
  }

}

Корневое поле запроса admin очень похоже на viewer, так что это не должно быть проблемой. Проблема в том, что я не нашел themeEdge (который, я считаю, должен присутствовать) в полезной нагрузке запроса (хотя admin { themes } есть):

query: "mutation CreateThemeMutation($input_0:CreateThemeInput!){createTheme(input:$input_0){clientMutationId,...F3}} fragment F0 on Admin{id} fragment F1 on Admin{id,...F0} fragment F2 on Admin{_themes2gcwoM:themes(first:20,query:""){count,pageInfo{hasNextPage,hasPreviousPage,startCursor,endCursor},edges{node{id,name,createdAt},cursor}},id,...F1} fragment F3 on CreateThemePayload{admin{id,...F0,id,...F2}}"
variables: {input_0: {name: "test", clientMutationId: "0"}}

В результате outputFields.themeEdge.resolve внутри мутации на стороне сервера никогда не вызывается, и я вижу это сообщение:

Warning: writeRelayUpdatePayload(): Expected response payload to include the newly created edge `themeEdge` and its `node` field. Did you forget to update the `RANGE_ADD` mutation config?

Я видел подобную проблему на github. Однако REQUIRED_CHILDREN не мой случай, потому что приложение уже запросило themes соединение. Я упускаю что-то очевидное? Должен ли я вставить больше информации? Спасибо.

версия реакции-реле: 0.6.1


person peresleguine    schedule 08.02.2016    source источник


Ответы (1)


Я столкнулся с той же проблемой и в конце концов решил ее, убедившись, что мой эквивалент themeEdge действительно существует как ребро в моей схеме. Если вы выберете свою схему для themeEdge, существует ли объект?

Для справки, вот мое определение края, адаптированное для вас:

{
      "name":"themeEdge",
      "description":null,
      "args":[],
      "type":{
        "kind":"NON_NULL",
        "name":null,
        "ofType":{
          "kind":"OBJECT",
          "name":"ThemeEdge",
          "ofType":null
        }
      },
      "isDeprecated":false,
      "deprecationReason":null
    }

и

{
    "kind":"OBJECT",
    "name":"ThemeEdge",
    "description":"An edge in a connection.",
    "fields":[{
      "name":"node",
      "description":"The item at the end of the edge.",
      "args":[],
      "type":{
        "kind":"NON_NULL",
        "name":null,
        "ofType":{
          "kind":"OBJECT",
          "name":"Theme",
          "ofType":null
        }
      },
      "isDeprecated":false,
      "deprecationReason":null
    }

Также обратите внимание, что ваш rangeBehaviors должен точно соответствовать запросу, который вы используете для получения родительского объекта. Вы можете указать несколько запросов следующим образом, что также показывает синтаксис, когда ваш запрос содержит несколько переменных:

{
    type: 'RANGE_ADD',
    parentName: 'admin',
    parentID: this.props.admin.id,
    connectionName: 'themes',
    edgeName: 'themeEdge',
    rangeBehaviors: {
      '': 'append',
      'first(1).id($adminId)': 'append',
    },
  }
person jbrown    schedule 10.02.2016
comment
Спасибо за Ваш ответ! Я опубликовал фрагмент schema.json, который мне кажется хорошим: 3dd5772a53a41fe5c68c. Пример мутации на стороне сервера был бы очень полезен. - person peresleguine; 10.02.2016
comment
Я использую сангрию, поэтому, если вы тоже, мой код на стороне сервера, вероятно, не сильно поможет. Ваша схема выглядит так же, как моя. Каков ваш код на стороне сервера? - person jbrown; 10.02.2016
comment
Я разместил комментарий к этой сути. - person peresleguine; 11.02.2016