2 minute read

💡[Устарело | 12.0.0] Метод query устарел и был заменен методом request. См. руководство по миграции: https://github.com/Shopify/shopify-app-js/blob/main/packages/apps/shopify-api/docs/migrating-to-v9.md#using-the-new-clients.

Вот пример кода, который использует переменные

mutation CreateMetafieldDefinition($definition: MetafieldDefinitionInput!) {
  metafieldDefinitionCreate(definition: $definition) {
    createdDefinition {
      id
      namespace
      key
      access
    }
    userErrors {
      field
      message
      code
    }
  }
}

Переменные

Переменная “definition” здесь является объектом

{
  "definition": {
    "name": "My read-only metafield definition",
    "namespace": "$app:some-namespace",
    "key": "some-key",
    "type": "single_line_text_field",
    "ownerType": "PRODUCT",
    "access": {
      "admin": "MERCHANT_READ",
      "storefront": "PUBLIC_READ"
    }
  }
}

Без использования переменных

Вот тот же код с входным объектом, встроенным непосредственно в запрос

Обратите внимание на следующие различия:

  • Свойства объекта не имеют кавычек
  • перечисления настроек также не имеют кавычек вокруг них
  • не используется типизация metafieldDefinitionInput
mutation {
  metafieldDefinitionCreate(
    definition: {
      name: "My read-only metafield definition"
      namespace: "$app:some-namespace"
      key: "some-key7"
      type: "single_line_text_field"
      ownerType: PRODUCT
      access: {
        admin: MERCHANT_READ,
        storefront: PUBLIC_READ
      }
    }
  ) {
    createdDefinition {
      id
      namespace
      key
      access {
        admin
        storefront
      }
    }
    userErrors {
      field
      message
      code
    }
  }
}

Дополнительно о запросах: Queries and Mutations | GraphQL


Переменные, прикрепленные к телу запроса

  • Запрос
    const client = new shopify.clients.Graphql({ session });
    const data = await client.query({
      data: {
        query: `mutation MetafieldsSet($metafields: [MetafieldsSetInput!]!) {
          metafieldsSet(metafields: $metafields) {
            metafields {
              key
              namespace
              value
              createdAt
              updatedAt
            }
            userErrors {
              field
              message
              code
            }
          }
        }`,
        variables: {
          metafields: [
            {
              key: "materials",
              namespace: "my_fields",
              ownerId: "gid://shopify/Product/20995642",
              type: "multi_line_text_field",
              value: "95% Cotton\n5% Spandex",
            },
            {
              key: "manufactured",
              namespace: "my_fields",
              ownerId: "gid://shopify/Product/20995642",
              type: "single_line_text_field",
              value: "Made in Canada",
            },
          ],
        },
      },
    });
    
  • Input variables
    {
      "metafields": [
        {
          "key": "materials",
          "namespace": "my_fields",
          "ownerId": "gid://shopify/Product/20995642",
          "type": "multi_line_text_field",
          "value": "95% Cotton\n5% Spandex"
        },
        {
          "key": "manufactured",
          "namespace": "my_fields",
          "ownerId": "gid://shopify/Product/20995642",
          "type": "single_line_text_field",
          "value": "Made in Canada"
        }
      ]
    }
    
  • Response JSON
    {
      "metafieldsSet": {
        "metafields": [
          {
            "key": "materials",
            "namespace": "my_fields",
            "value": "95% Cotton\n5% Spandex",
            "createdAt": "2024-03-27T13:45:34Z",
            "updatedAt": "2024-03-27T13:45:34Z"
          },
          {
            "key": "manufactured",
            "namespace": "my_fields",
            "value": "Made in Canada",
            "createdAt": "2024-03-27T13:45:34Z",
            "updatedAt": "2024-03-27T13:45:34Z"
          }
        ],
        "userErrors": []
      }
    }
    

Примеры → Изменение и обновление метаполей → Node.js

metafieldsSet

Переменные, переданные как аргумент запроса

  • Запрос

    const productQuery = `
      query ProductQuery($handle: String) {
        product(handle: $handle) {
          id
          title
          handle
        }
      }
    `;
    
    const { data, errors, extensions } = await client.request(productQuery, {
      variables: {
        handle: "sample-product",
      },
    });
    

Запрос для продукта

shopify-app-js/packages/api-clients/graphql-client at main · Shopify/shopify-app-js

Пример работающего кода с передачей массива полей

class SettingMetafield {
  namespace = "app_namespace";

  type = "single_line_text_field";

  ownerId = appInstallationID;

  constructor(key, value) {
    this.key = key;
    this.value = value;
  }
}

const metafields = [
  prerenderAndPrefetchMetafield,
  prerenderMetafield,
  timeoutMetafield,
  throttleMetafield,
];
// console.log(metafields);

const setMetafieldsQuery = `
        mutation metafieldsSet($metafields: [MetafieldsSetInput!]!) {
          metafieldsSet(metafields: $metafields) {
            metafields {
              id
              namespace
              key
            }
            userErrors {
              field
              message
            }
          }
        }
      `;

// console.log(setMetafieldsQuery);

gqlResponse = await client.request(setMetafieldsQuery, {
  variables: {
    metafields: [...metafields],
    // metafields: metafields; // same, spread operator isn't necessary here
    // metafields; // same, shorthand syntax, because the key is the same as value
  },
});