提问者:小点点

在API中链接多个.then.catch-在将头发送到客户端后无法设置它们


所以我试图创建一个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


共1个答案

匿名用户

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);
}
};