使用Node.js+CSV自动导入Shopify产品遇401授权错误求助
一、修复核心凭证错误
你当前的401错误是因为API凭证参数传错了:
shopify-api-node里的password参数需要的是Admin API访问令牌,不是你用的API Secret。- API Secret仅用于webhook签名验证,不能直接作为API调用的密码。
获取正确的访问令牌:
- 进入Shopify后台 → 「应用与销售渠道」→ 打开你创建的自定义应用
- 切换到「API凭据」标签页
- 找到「Admin API访问令牌」,点击「显示」复制该值,将其填入
.env的对应变量(建议重命名为ADMIN_ACCESS_TOKEN更清晰)
二、确认API权限配置
确保你的应用拥有创建产品的权限:
- 在自定义应用页面,进入「配置Admin API范围」
- 找到
Products分类,勾选**write_products**权限 - 点击「保存」,如果刚修改权限,建议重新生成一次Admin API访问令牌
三、修正ShopName格式
shopName参数只需要填写myshopify域名的前缀部分:
- 比如你的店铺地址是
shop-name.myshopify.com/admin,那么process.env.SHOP_NAME应该设为shop-name,不要带.myshopify.com或/admin
四、优化代码避免API限流(可选但关键)
你当前的代码会同时发起大量请求,容易触发Shopify的API速率限制,建议改成批量异步处理:
const express = require("express"); const dotenv = require("dotenv"); const fs = require("fs"); const parse = require("csv-parser"); const Shopify = require("shopify-api-node"); const app = express(); dotenv.config(); // 初始化Shopify客户端 const shopify = new Shopify({ shopName: process.env.SHOP_NAME, apiKey: process.env.API_KEY, password: process.env.ADMIN_ACCESS_TOKEN, // 这里用正确的Admin API访问令牌 }); // 收集CSV数据后批量创建产品 const products = []; fs.createReadStream("products.csv") .pipe(parse({ columns: true, delimiter: "," })) .on("data", (product) => products.push(product)) .on("end", async () => { console.log(`开始创建${products.length}个产品...`); const batchSize = 5; // 每次批量处理5个产品,可根据情况调整 for (let i = 0; i < products.length; i += batchSize) { const batch = products.slice(i, i + batchSize); try { await Promise.all( batch.map(async (productData) => { // 映射CSV字段到Shopify API要求的格式 const shopifyProduct = { title: productData.Title, handle: productData.Handle, product_type: productData["Product Type"], vendor: productData.Vendor, // 根据你的CSV字段补充其他必要字段 }; const createdProduct = await shopify.product.create(shopifyProduct); console.log(`已创建产品:${createdProduct.title}`); }) ); } catch (error) { console.error("批量创建失败:", error); } // 批量之间添加延迟,避免触发限流 await new Promise(resolve => setTimeout(resolve, 1000)); } console.log("所有产品处理完成"); }); const port = process.env.PORT || 3000; app.listen(port, () => { console.log(`服务运行在端口 ${port}`); });
五、验证CSV字段匹配
Shopify Product API有必填字段(如title),导出的CSV字段名可能和API要求的驼峰命名不一致,建议手动映射字段(如示例代码中的shopifyProduct对象),避免因字段不匹配导致的创建失败。
内容的提问来源于stack exchange,提问作者Anik Dev
相关产品推荐
相关产品推荐

