当前位置: 首页 > 知识库问答 >
问题:

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

咸星波
2023-03-14

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

燕昊东
2023-03-14

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);
}
};
 类似资料:
  • 问题内容: 将标头发送到客户端后,无法设置标头。这是请求验证后的后端错误,看起来像标头问题。我为我的项目脏代码感到抱歉,我还需要做其他事情,因此在注释中有一些代码。这是我的代码 您可以在我的代码中发现其他错误,因为我尝试了许多不同的方法。这是passport.js配置文件 这是身份验证的ajax请求 非常感谢你。 问题答案: 这是由于您的代码试图从authenticate函数发送多个响应。 删除其

  • 将标头发送到客户端后,无法对其进行设置。这是我的身份验证post请求后的后端错误。看起来标题有问题。我很抱歉我的项目肮脏的代码,我需要做一些别的事情,所以有一些代码在评论中。这是我的代码 你可以在我的代码中找到其他错误,因为我尝试了许多不同的方法。以下是passport.js配置文件 这是用于身份验证的 ajax 请求 非常感谢。

  • 我在NodeJS中使用Passport.js、Express和Mongoose时遇到了这个奇怪的问题。基本上,即使我只发送了一个头,我还是得到一个错误,说“不能在头被发送到客户端后设置它们”。 我读过其他帖子并尝试过,但没有一个有效。 应用程序。get-res.send与return res.send之间有什么区别吗 错误[ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后,无法设

  • 我正在关注一个关于udemy上的节点.js的课程,这有点过时了,遇到了这些错误,我无法找到解决方案。 我尝试了什么: 使用next(); 在所有if语句中添加返回res 有人能帮我修一下这些吗?我将不胜感激! 提前感谢! 用户名存在错误:错误 [ERR_HTTP_HEADERS_SENT]:在服务器响应.set 上将标头发送到客户端后无法设置标头 (_http_outgoing.js:526:11

  • 问题内容: 我对Node.js相当陌生,遇到了一些问题。 我正在使用Node.js 4.10和Express 2.4.3。 当我尝试访问http://127.0.0.1:8888/auth/facebook时,我将重定向到http://127.0.0.1:8888/auth/facebook_callback。 然后,我收到以下错误: 以下是我的代码: 我可以知道我的代码有什么问题吗? 问题答案:

  • 问题内容: 我对Node.js相当陌生,遇到了一些问题。 我正在使用Node.js 4.10和Express 2.4.3。 当我尝试访问http://127.0.0.1:8888/auth/facebook时,我将重定向至http://127.0.0.1:8888/auth/facebook_callback。 然后,我收到以下错误: 以下是我的代码: 我可以知道我的代码有什么问题吗? 问题答案: