使用Square Node.js SDK Orders API时location_id参数报错求助
问题详情
我通过Node.js调用Square API的ordersApi.searchOrders方法,代码如下:
const customerOrders = await ordersApi.searchOrders({location_ids: ["MY_LOCATION_ID"]});
后续还有其他参数/过滤器,但因location_id问题无法执行到该环节。
根据Square官方文档,该接口要求请求体为包含location_ids键的对象,对应字符串类型的位置ID数组,我仅有一个位置ID。
我已尝试十多种传递方式,包括:
- 仅传单个位置ID(非数组)
- 传包含ID的数组
location_ids对应单个字符串- 硬编码ID
- 通过程序获取并传递ID
但始终收到400错误:"Must provide at least 1 location_id"。确认所有必填项和参数顺序合规,否则不会触发该特定错误。
这个项目能帮小企业每周节省数百美元工时——此前因第三方(Squarespace/Acuity)未触发忠诚度API,员工需手动添加积分。
解决思路
1. 确认请求体的嵌套结构
Square Node.js SDK要求searchOrders的请求体需包裹在body字段中,而非直接传递顶层对象。调整代码如下:
const customerOrders = await ordersApi.searchOrders({ body: { location_ids: ["MY_LOCATION_ID"] } });
直接传顶层对象会导致服务器无法识别location_ids字段,进而返回缺少参数的错误。
2. 验证Location ID的有效性
调用locationsApi.listLocations()获取账户下所有有效Location ID,确认你使用的ID在返回结果中:
const locations = await locationsApi.listLocations(); console.log("有效Location ID列表:", locations.locations.map(loc => loc.id));
若ID不在列表中,说明ID无效,需替换为正确的有效ID。
3. 检查SDK版本兼容性
确保使用的Square SDK版本与官方文档匹配,旧版本可能存在请求结构差异。执行命令更新至最新版本:
npm update square
4. 开启调试查看实际请求内容
初始化Square客户端时开启调试日志,查看实际发送的请求体是否包含location_ids:
const { Client, Environment } = require('square'); const client = new Client({ accessToken: '你的访问令牌', environment: Environment.Sandbox, // 生产环境替换为Environment.Production logLevel: 'debug' });
通过控制台输出的请求详情,可判断参数是否在传递过程中丢失或格式错误。
5. 确认权限与授权范围
检查Square API访问令牌是否拥有ORDERS_READ权限,且授权账户包含该Location ID。权限不足可能会伪装成参数错误提示,需在Square开发者后台验证令牌权限。
内容的提问来源于stack exchange,提问作者R Greenstreet

