【问题标题】:GET request returns single ID informationGET请求返回单个ID信息
【发布时间】:2020-01-07 18:26:15
【问题描述】:

我有以下 API 调用,它应该返回每个 ID 的数据,但是对于 v2,它不会返回有关每个订单的信息,而是只显示一个 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)
            })
    })

【问题讨论】:

    标签: api express bigcommerce


    【解决方案1】:

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

     res.status(200).json(bothResponses)
    

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

    相反,您需要将所有 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() 迭代数组。为数组中的每个项目返回一个承诺。
    2. 使用Promise.all() 监控promise 数组并将其转换为有序结果数组。
    3. 为 http 请求创建一个响应,并在所有数据可用时发送该响应。
    4. 当任何 api 调用出现错误时发送错误状态。
    5. 删除.status(200),因为这已经是默认设置,所以没有必要。
    6. 为第二个 API 调用添加错误处理(通过将承诺返回到更高级别,以便 .catch() 也将捕获那些第二个 API 调用错误)。

    【讨论】:

    • 感谢您的详细解答。我一定会改进我未来的 API 工作。不幸的是,结果仍然相同 - v2 仅显示其中一个订单和控制台日志。
    • @SamuilIlkov - 我无法帮助您调试我看不到的代码。如果您需要有关代码的其他迭代的帮助,您将不得不“编辑”您的问题以将新的迭代添加到答案的末尾并给我留言告诉我您已经这样做了。不要更改问题中的先前迭代(因为它们代表原始问题)。
    • 更新:在 API 调用之外添加了一个数组并推送“refundedOrders”。比 v2 是 v2: dataArray[0] 并且似乎工作得很好。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-09-04
    • 2018-08-27
    • 2017-11-06
    • 2019-11-08
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    相关资源
    最近更新 更多