2

TODO の例を変更して、最初の React/Relay アプリケーションを作成しています。パラメータ bookCount を持つオブジェクト Distributor に独自のミューテーションを追加するところまで来ました。このミューテーションは AddBook と呼ばれ、単純に書籍の数を 1 増やします。この時点で、ミューテーションはエラーなく実行され、楽観的に bookCount を正しく 1 増やしますが、サーバーからの応答を受け取ると、モデルの変更を元に戻します。これは、サーバーからの応答に、指定した出力フィールドが不思議なことに含まれていないためだと思います。

これが私の突然変異です:

var GraphQLAddBookMutation = mutationWithClientMutationId({
  name: 'AddBook',
  inputFields: {
  },
  outputFields: {
    distributor: {
      type: GraphQlDistributor,
      resolve: () => getDistributor(),
    },
  },
  mutateAndGetPayload: () => {
    console.log("Trying to mutate.");
    addBook();
    return {};
  },
});

outputFields に「distributor」フィールドが含まれていますが、graphql 応答には「distributor」データが含まれていません。

Graphql の応答は次のとおりです。

{
  "data": {
  "addBook": {
    "clientMutationId": "0"
    }
  }
}

mutateAndGetPayload 関数は呼び出されるが、ディストリビューター解決関数は呼び出されないことを確認しました。

outputFields のすべてのフィールドが graphql 応答に含まれ、outputFields 内のすべての解決関数が呼び出されて、応答に適切なパラメーターが入力されることを期待していましたが、そうではありません

生成された schema.json には、AddBookPayload で指定した outputFields が含まれているため、これは特に混乱を招きます。

{
      "kind": "OBJECT",
      "name": "AddBookPayload",
      "description": null,
      "fields": [
        {
          "name": "distributor",
          "description": null,
          "args": [],
          "type": {
            "kind": "OBJECT",
            "name": "Distributor",
            "ofType": null
          },
          "isDeprecated": false,
          "deprecationReason": null
        },
        {
          "name": "clientMutationId",
          "description": null,
          "args": [],
          "type": {
            "kind": "NON_NULL",
            "name": null,
            "ofType": {
              "kind": "SCALAR",
              "name": "String",
              "ofType": null
            }
          },
          "isDeprecated": false,
          "deprecationReason": null
        }
      ],
      "inputFields": null,
      "interfaces": [],
      "enumValues": null,
      "possibleTypes": null
    },
4

1 に答える 1