GET请求返回单个ID信息

时间:2019-09-04 20:54:49

标签: api express bigcommerce

我有以下API调用,该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)
            })
    })

1 个答案:

答案 0 :(得分:2)

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

 res.status(200).json(bothResponses)

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

相反,您需要将所有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调用添加错误处理(通过将Promise返回到更高级别,以便.catch()也会捕获到这些第二个API调用错误)。