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

Topic summary

GraphQL の productCreateMedia で存在しない外部URL画像をアップロードした際、エラーが適切に返されない問題が報告されています。

現象:

  • 存在しないURLを originalSource に指定しても、メディアの statusUPLOADED になる
  • fileErrorsmediaWarningsmediaUserErrors のいずれも空で返される
  • 管理画面ではエラーメッセージが表示されるが、API レスポンスには含まれない

回避策:
調査により、productCreateMedia 実行後に別途 product クエリでメディア情報を取得すると、エラーが確認できることが判明しました:

  • statusFAILED になる
  • mediaErrors に詳細情報(コード、メッセージ等)が含まれる

今後の対応:

  • 仕様として正しいかは不明
  • Shopify の engineering@shopify.engineering へ改善リクエストを送ることで、将来のバージョンで修正される可能性あり
  • 当面は product クエリで再取得してエラーを確認する方法で対応可能
Summarized with AI on November 19. AI used: claude-sonnet-4-5-20250929.

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

MediaのstatusはUPLOADED

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

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

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

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

@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でうまいことエラーを取得する方法もあるかもしれません。

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

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

(キュー田辺)

1 Like

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

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

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

1 Like