Netlify Lambda调用Shopify Admin REST API出现401、422错误如何解决?
问题根因排查
401未授权错误原因
- 核心错误是
axios.post参数传递格式错误:axios.post的正确语法是axios.post(请求地址, 请求体数据, 配置对象),你的代码里把请求体和配置都塞到了第二个参数的对象中,导致配置中的Authorization请求头完全没有被传递到请求中,因此接口返回未授权。 - 次要排查点:Netlify环境变量配置错误,确认Netlify站点后台的环境变量中是否正确配置了
SHOPIFY_ADMIN_API_KEY、SHOPIFY_ADMIN_PASSWORD、GATSBY_SHOPIFY_STORE_URL三个变量,注意Admin API密钥属于敏感信息,不要使用GATSBY_开头的命名,避免被打包到前端代码泄露。 - 权限校验:确认你在Shopify后台创建的自定义应用已经开通了
write_customers权限,否则即使密钥正确也会返回未授权。
422请求无法处理错误原因
- 本地运行偶尔成功的原因是大概率你本地axios有全局默认配置,刚好带上了正确的Authorization头,请求能到达Shopify接口。返回422是请求参数不符合Shopify要求,常见原因包括:
- 请求提交的邮箱已经在该Shopify站点的用户列表中存在
- 邮箱格式非法
marketing_opt_in_level参数取值不符合你Shopify站点的营销订阅规则- 你提前对请求体做了
JSON.stringify处理,axios默认会自动将对象转为JSON格式,手动序列化反而可能导致格式异常
修正后的代码
const axios = require('axios'); exports.handler = async (event) => { try { // 敏感变量不要用GATSBY_前缀,避免泄露到前端 const endpoint = `https://${process.env.SHOPIFY_STORE_URL}/admin/api/2021-10/customers.json`; const authStr = Buffer.from(`${process.env.SHOPIFY_ADMIN_API_KEY}:${process.env.SHOPIFY_ADMIN_PASSWORD}`).toString('base64'); const config = { headers: { 'Content-Type': 'application/json', Authorization: `Basic ${authStr}`, }, }; // 不要提前stringify,axios会自动处理序列化 const data = { customer: { first_name: event.body.userName || 'Subscriber', email: event.body.userEmail, accepts_marketing: true, marketing_opt_in_level: 'confirmed_opt_in', }, }; // 修正axios传参格式 const { status, statusText } = await axios.post(endpoint, data, config); return { statusCode: status, statusText }; } catch (error) { // 错误时打印完整响应信息,方便定位422的具体原因 console.error('请求错误详情:', error.response?.data || error.message); return { statusCode: error.response?.status || 500, body: JSON.stringify({ message: error.message, detail: error.response?.data || null }) }; } };
内容的提问来源于stack exchange,提问作者csdk
相关产品推荐
相关产品推荐

