FROM CACHE - jp_header
このコミュニティはピアツーピアサポートに移行しました。Shopify サポートは今後、このコミュニティへのサービスを提供いたしません。これからもぜひ、他のマーチャントやパートナーとつながり、サポートし合い、経験を共有してください。 当社の行動規範に違反する行動や削除を希望するコンテンツがありましたら、引き続きご報告ください

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

解決済

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

WEBUILD
Shopify Partner
39 11 42

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

MediaのstatusはUPLOADED

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

 

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

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

 

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

 

1 件の受理された解決策

Qcoltd
Shopify Partner
1170 473 458

成功

@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://web.q-co.jp/ テックブログ: https://techlab.q-co.jp/

元の投稿で解決策を見る

2件の返信2

Qcoltd
Shopify Partner
1170 473 458

成功

@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://web.q-co.jp/ テックブログ: https://techlab.q-co.jp/
WEBUILD
Shopify Partner
39 11 42

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

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

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