Node で Asset APIをPOSTしたい

Shopify埋め込み公開アプリを、node (Shopify App CLI)、 React で構築しています。

指定したアセットファイルをテーマのアセットに追加するようなアプリを作りたいのですが、

node (server.js)で以下のように記述すると、下記のエラーがでてしまい、困っています。

   router.get("/post-assets", async (ctx, next) => {
    try {
      const shop = ctx.cookies.get("shopOrigin");
      
      //get main theme ID
      const themeId = await fetch(
        ...
        (メインテーマのIDを取得)
     ...
        console.log(ID);
        return ID;
        });

      // post asset
      await fetch(
        `https://${shop}/admin/api/2019-04/theme/${themeId}/assets.json`,
        {
          methods: "PUT",
        },
        {
          headers: {
            "X-Shopify-Access-Token": ctx.cookies.get("accessToken"),
            "Content-Type": "application/json",
          },
        },
        {
          body: JSON.stringify({
            assets: {
              key: "template/index.liquid",
              src: "http://apple.com/new_bg.gif",
            },
          }),
        }
      )
        .then((response) => response.json())
        .then((data) => console.log(data))
        .catch((error) => {
          console.error("Error:", error);
        });
    } catch (err) {
      console.log(err);
    }
  });

エラーメッセージ

86586851463 // メインテーマのIDは取得できる
{
 errors: '[API] Invalid API key or access token (unrecognized login or wrong password)' 
 }

アセットファイルの追加方法が間違っているでしょうか? 記述がもし間違っていたら、教えていただけると幸いです。

以下の例が参考になるかと思います。
https://shopify.dev/docs/admin-api/rest/reference/online-store/asset?api[version]=2020-04#update-2020-04

ご提示のコードは、index.liquidというテンプレートを追加するコードなので、画像を追加する場合は、

 "key": "assets/empty.gif",
    "attachment": "R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==\n"
  }

のようになると思います。

また、エラーの内容は、アクセストークンのパーミションが足らないようにも見えますので、下記をみて、テーマの更新ができるscopeをつけてアクセストークンを生成しているか、確認された方が良いと思います。
https://shopify.dev/docs/admin-api/access-scopes

1 Like

@junichiokamura さん、

ありがとうございます。

画像を追加する方法参考にし、また、そもそも最初に書いたコードの中にいくつかミスがあり、それを修正して、無事AssetsのPUTができました。(お恥ずかしながらthemesがthemeになっていたり、fetchの記述が間違っておりました。。)

大変ありがとうございました。

1 Like