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