FROM CACHE - jp_header

【GraphQL】productCreateMediaで存在しないメディアをアップした際、エラーメッセージが返ってこない

解決済
WEBUILD
Shopify Partner
39 11 41

タイトル通り GraphQL のproductCreateMediaで画像をアップしようとしています。
その際、存在しない外部URLをoriginalSource に与えても、

MediaのstatusはUPLOADED

fileErrors、mediaWarnings、mediaUserErrorsにはいずれも何も返ってきません。
しかし実際には当然存在しないURLなので、コンテンツ管理の画面に行くとエラーメッセージが表示されています。

 

これはこういう仕様なのでしょうか?

間違ったURLを与えてもMediaIDですらもしっかり返ってくるので、ミスの判定ができなくて困っております。

 

ご教示いただければ幸いです。

 

1 件の受理された解決策
Qcoltd
Shopify Partner
931 371 353

成功

@WEBUILD 様

 

興味があり調査してみました。

 

productCreateMediaのoriginalSourceに、

画像URLとしての形式に誤りはないが、実際には404になるようなURLを渡した場合、

APIからエラーが返却されないことが、

仕様であるかどうかは調べられませんでした。

しかし、開発環境で試したところ、質問者様と同様の結果になることは確認できました。

 

仕様であればおかしな仕様であるように思うので、

https://github.com/Shopify

に記載のある、

engineering@shopify.engineering

にリクエストを送るなどすると、

未来のバージョンで修正されるかもしれません。

 

ところで、

一旦、今の状態で、どうやってエラーを見分けるかを考えたみたのですが、

productCreateMediaを実行した後に、

下記のようにproduct queryでその商品のメディアの情報を取得すると、

    query ($productId: ID!) {
      product(id: $productId) {
        media (first: 20) {
            edges {
                node {
                    alt
                    status
                    mediaErrors {
                        code
                        details
                        message
                    }
                }
            }
        }
    }

 下記のようにエラーが返却されることを確認できました。

                        "node": {
                            "alt": "test",
                            "status": "FAILED",
                            "mediaErrors": [
                                {
                                    "code": "UNKNOWN",
                                    "details": "The file does not exist - https://xxxx.xxxxxxxx.com/hoge.jpg",
                                    "message": "Media processing failed"
                                }
                            ]
                        }

 

しかし、

下記のように、productCreateMediaで直接productのmediaの情報を取得すると、

mutation productCreateMedia($media: [CreateMediaInput!]!, $productId: ID!) {
  productCreateMedia(media: $media, productId: $productId) {
    media {
      alt
      mediaContentType
      status
    }
    mediaUserErrors {
      code
      field
      message
    }
    product {
      media(first: 20) {
          edges {
              node {
                  alt
                  status
                  mediaErrors {
                    code
                    details
                    message
                  }
              }
          }
      }
    }
  }
}

下記のように、statusがUPLOADEDとなり、エラーが返却されません。

                            "node": {
                                "alt": "test",
                                "status": "UPLOADED",
                                "mediaErrors": []
                            }

 

エラーを取得するには、

productCreateMediaの後に、改めてproduct queryを実行する必要がありそうでした。

 

私自身はAPIやGraphQLに詳しいわけではないので、

1回のqueryでうまいことエラーを取得する方法もあるかもしれません。

本回答は、私が分かる範囲までの情報であることご留意ください。

 

何か参考になる情報があれば幸いです。

(キュー田辺)

株式会社Q (キュー)
グラフィックデザイン、アパレル事業、Web制作など色々やっている渋谷区代々木の会社です。ShopifyでのECサイトの運営・開発も行なっています。
https://techlab.q-co.jp/

元の投稿で解決策を見る

2件の返信2
Qcoltd
Shopify Partner
931 371 353

成功

@WEBUILD 様

 

興味があり調査してみました。

 

productCreateMediaのoriginalSourceに、

画像URLとしての形式に誤りはないが、実際には404になるようなURLを渡した場合、

APIからエラーが返却されないことが、

仕様であるかどうかは調べられませんでした。

しかし、開発環境で試したところ、質問者様と同様の結果になることは確認できました。

 

仕様であればおかしな仕様であるように思うので、

https://github.com/Shopify

に記載のある、

engineering@shopify.engineering

にリクエストを送るなどすると、

未来のバージョンで修正されるかもしれません。

 

ところで、

一旦、今の状態で、どうやってエラーを見分けるかを考えたみたのですが、

productCreateMediaを実行した後に、

下記のようにproduct queryでその商品のメディアの情報を取得すると、

    query ($productId: ID!) {
      product(id: $productId) {
        media (first: 20) {
            edges {
                node {
                    alt
                    status
                    mediaErrors {
                        code
                        details
                        message
                    }
                }
            }
        }
    }

 下記のようにエラーが返却されることを確認できました。

                        "node": {
                            "alt": "test",
                            "status": "FAILED",
                            "mediaErrors": [
                                {
                                    "code": "UNKNOWN",
                                    "details": "The file does not exist - https://xxxx.xxxxxxxx.com/hoge.jpg",
                                    "message": "Media processing failed"
                                }
                            ]
                        }

 

しかし、

下記のように、productCreateMediaで直接productのmediaの情報を取得すると、

mutation productCreateMedia($media: [CreateMediaInput!]!, $productId: ID!) {
  productCreateMedia(media: $media, productId: $productId) {
    media {
      alt
      mediaContentType
      status
    }
    mediaUserErrors {
      code
      field
      message
    }
    product {
      media(first: 20) {
          edges {
              node {
                  alt
                  status
                  mediaErrors {
                    code
                    details
                    message
                  }
              }
          }
      }
    }
  }
}

下記のように、statusがUPLOADEDとなり、エラーが返却されません。

                            "node": {
                                "alt": "test",
                                "status": "UPLOADED",
                                "mediaErrors": []
                            }

 

エラーを取得するには、

productCreateMediaの後に、改めてproduct queryを実行する必要がありそうでした。

 

私自身はAPIやGraphQLに詳しいわけではないので、

1回のqueryでうまいことエラーを取得する方法もあるかもしれません。

本回答は、私が分かる範囲までの情報であることご留意ください。

 

何か参考になる情報があれば幸いです。

(キュー田辺)

株式会社Q (キュー)
グラフィックデザイン、アパレル事業、Web制作など色々やっている渋谷区代々木の会社です。ShopifyでのECサイトの運営・開発も行なっています。
https://techlab.q-co.jp/
WEBUILD
Shopify Partner
39 11 41

ご回答ならびご検証いただき誠にありがとうございます。

やはり、同様の結果になってしまいますよね。。。

とりあえずご教示いただいた方法でエラーを取得して正常にアップロードが完了しているか確認してから、続きの作業を行うようにします!
ありがとうございました🙏