所以我试图创建一个API来调用一个API。然后将调用另一个API。但我有个错误。我试了所有的办法,但似乎找不到解决办法。
我得到了两次错误:
UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
这是密码。我有相同的代码,但没有forEach(当数据不是数组时),这是可行的。
if (Array.isArray(data)) {
data.forEach(
async (orderData) => {
await shopify.order
.list({ name: orderData.OrderNo._text })
.then(async (order) => {
return await shopify.fulfillment
.updateTracking(
order[0].fulfillments[0].id,
{
tracking_info: {
number:
orderData.tN._text,
url: orderData.tU._text,
company: orderData.tC._text,
},
}
)
.then(async (updatedOrder) => {
return await shopify.fulfillment
.complete(
updatedOrder.order_id,
order[0].fulfillments[0].id
)
.then((fulfilledOrder) => {
res.json(fulfilledOrder);
});
});
})
.catch((err) => res.json(err));
}
);
} else
这是完整的代码:https://jsfidle.net/5qa2l7mu
forEach是一个允许对数组的每个元素调用函数的数组方法。
因此使用aync/await和promission.all()
const childFunction = async (orderData) => {
try {
const order = await shopify.order
.list({ name: orderData.OrderNo._text })
.then((r) => r)
.catch((e) => {
throw e;
});
const updatedOrder = await shopify.fulfillment
.updateTracking(order[0].fulfillments[0].id, {
tracking_info: {
number: orderData.tN._text,
url: orderData.tU._text,
company: orderData.tC._text
}
})
.then((r) => r)
.catch((e) => {
throw e;
});
const fulfilledOrder = await shopify.fulfillment
.complete(updatedOrder.order_id, order[0].fulfillments[0].id)
.then((r) => r)
.catch((e) => {
throw e;
});
return fulfilledOrder;
} catch (e) {
console.log(e);
throw e;
}
};
const getFulfilledOrders = async (req, res) => {
let fulfilledOrders = null;
const promises = [];
try {
if (Array.isArray(data) && data.length) {
data.forEach(async (orderData) => {
const promise = new Promise((resolve, reject) => {
childFunction(orderData)
.then((r) => {
resolve(r);
})
.catch((e) => {
console.log('Error: ', e);
reject(e);
});
});
promises.push(promise);
});
if (promises.length) {
fulfilledOrders = await Promise.all(promises).then((r) => r);
}
}
return res.json(fulfilledOrders);
} catch (error) {
console.log('Error: ', error);
return res.json(error);
}
};