Zapier中如何利用首次API调用结果发起二次调用?
在Zapier中链式调用API:解决Promise与async/await的使用问题
你的问题核心是没正确处理异步请求的Promise结果——直接把z.request()返回的Promise当作实际数据来用了,自然拿不到id这类属性。要实现“用第一次API的结果发起第二次调用”,必须用async/await等待第一个请求完成,拿到真实数据后再构建第二个请求的参数。
先给你修正后的完整代码,再逐点说明问题:
// 整个逻辑包裹在async函数中,Zapier支持这种写法 return z.execute(async function(bundle) { const options = { url: `https://url.sample/${bundle.authData.tenant}/api/${bundle.inputData.catalogs}/items?skip=0&limit=1`, method: 'GET', headers: { 'Accept': 'application/json', 'Authorization': bundle.authData.token }, params: {}, removeMissingValuesFrom: { 'body': false, 'params': false }, } // 用await等待第一个请求完成,拿到真实响应数据 const response = await z.request(options); const data = response.json; // 基于第一个请求的结果构建第二个请求的参数 const options2 = { url: `https://url.sample/${bundle.authData.tenant}/api/${bundle.inputData.catalogs}/items/${data[0].id}`, method: 'GET', headers: { 'Accept': 'application/json', 'Authorization': bundle.authData.token }, params: {}, removeMissingValuesFrom: { 'body': false, 'params': false }, } // 同样用await等待第二个请求完成 const response2 = await z.request(options2); const data2 = response2.json; const final_result = []; // 先判断apps是否存在且为数组,避免结构不符时报错 if (data2.apps && Array.isArray(data2.apps)) { for (let i of data2.apps) { // 修正原代码的变量错误,往final_result里推数据 final_result.push({ "eventName": "catalog.app.completed", "catalog": bundle.inputData.catalogs, "record": data[0].id, // 取第一个请求返回的id,修正原代码的data.ID错误 "app": i.name }); } } return final_result; })(bundle);
关键修正点:
- 包裹async函数:Zapier允许用
z.execute(async function(bundle) { ... })运行异步逻辑,这样内部就能合法使用await。 - 用await等待请求完成:
z.request()返回的是Promise对象,必须用await拿到真实的响应后,再通过response.json解析出实际数据,不能直接把Promise当作结果来用。 - 修正变量错误:原代码把数据推送目标写成了
data,应该是final_result;record字段的data.ID是错误写法,正确应该是data[0].id。 - 增加容错判断:遍历
data2.apps前先验证它的存在性和类型,避免API返回结构不符合预期时抛出错误。
另外,原代码第一个URL里的多余//已经修正,避免请求路径出错。
内容的提问来源于stack exchange,提问作者Artificial_Float
相关产品推荐
相关产品推荐

