GET请求returns单ID信息

GET request returns single ID information

我有以下 API 调用,它应该为每个 ID return 数据,但是对于 v2,而不是 returning 关于每个订单的信息,它只显示其中一个 ID。有趣的是所有命令都显示在控制台日志中。

 app.get("/all", function (req, res) {
        api.get("/v3/orders/refunds")

            .then((response) => {
                // console.log(response.data[0].order_id) 
                // console.log(response)

                for (var i = 0; i < response.data.length; i++) {
                    // console.log(response.data[i].order_id)
                    let ids = response.data[i].order_id;
                    // console.log(ids)

                    api.get(`/v2/orders/${ids}`)
                        .then((refundedOrders) => {

                            bothResponses = {
                                v3: response,
                                v2: refundedOrders
                            }

                            console.log(bothResponses)
                            res.status(200).json(bothResponses)
                        })
                    }
            })

            .catch((err) => {
                console.log(err)
            })
    })

您已经创建了一个 for 循环来遍历各种订单,但在该 for 循环中,您调用:

 res.status(200).json(bothResponses)

每个请求只能得到一个响应,因此当您在 for 循环的第一次迭代中调用它时,不会再次为该请求发送其他响应。 for 循环中对 res.json() 的后续调用将被忽略。事实上,他们应该向您的控制台输出有关 "headers already sent" 或类似内容的警告。

相反,您需要将所有 ID 的结果累积到一个数组中,然后发送一个包含其中所有数据的响应。

您可以使用 Promise.all() 将所有订单累积到一个数组中,并在完成时通知您,如下所示:

app.get("/all", function(req, res) {
    api.get("/v3/orders/refunds").then((response) => {
        // console.log(response.data[0].order_id) 
        // console.log(response)

        return Promise.all(response.data.map(item => {
            return api.get(`/v2/orders/${item.order_id}`);            
        })).then(refundedOrders => {
            let bothResponses = {
                v3: response,
                v2: refundedOrders
            }

            console.log(bothResponses);
            res.json(bothResponses);
        });
    }).catch((err) => {
        console.log(err);
        res.sendStaus(500);
    })
});

改进列表:

  1. 使用.map()迭代数组。 Return 数组中每一项的承诺。
  2. 使用Promise.all()监控promise数组,将其转化为有序结果数组。
  3. 创建一个对 http 请求的响应,并在所有数据可用时发送该响应。
  4. 当任何 api 调用出错时发送错误状态。
  5. 删除 .status(200),因为它已经是默认值,因此没有必要。
  6. 为第二次 API 调用添加错误处理(通过将承诺返回到更高级别,这样 .catch() 也会捕获那些第二次 API 调用错误)。