【发布时间】:2019-09-05 02:47:40
【问题描述】:
我正在使用 Selly API 并尝试获取所有产品,但是 Selly API 对产品进行分页。
所以我需要获取所有产品并添加到一个数组中,然后通过 JSON 输出结果。
const base64 = require('base-64');
import fetch from 'isomorphic-unfetch';
export default async (req, res) => {
res.setHeader('Content-Type', 'application/json');
try {
request('products')
.then(data => data.json())
.then(json => res.status(200).end(JSON.stringify(json)));
} catch(err) {
res.end(JSON.stringify({
"error": err
}));
}
}
const getToken = () => {
return base64.encode(`${process.env.api.email}:${process.env.api.key}`);
}
const request = async (endpoint = '', page) => {
const options = {
headers: {
Authorization: `Basic ${getToken()}`,
'User-Agent': `${process.env.api.email} - https://example.com`
}
}
return fetch(`https://selly.io/api/v2/${endpoint}?page=${page}`, options);
}
我正在尝试获取https://selly.io/api/v2/products?page=${page},直到返回结果为空数组[]。
我的尝试是这样的:
const repeatedRequest = async (data, endpoint) => {
let i = 1;
while (data.length > 0) {
console.log(data);
await request(endpoint, i).then((res) => {
data.push(res);
i++;
});
}
return data;
}
但是这不起作用,因为返回结果是一个空数组。我也很困惑如何与以下 sn-p 一起执行此操作:
request('products')
.then(data => data.json())
.then(json => res.status(200).end(JSON.stringify(json)));
我将如何在这个函数中工作?
我该怎么做?
【问题讨论】:
-
那个循环看起来很假。
while (data.length >0) /*push something into data*/。假设它开始了,这似乎是一个无限循环。data只会越来越长,对吧?我看不出data.length可能会变成0。我期待一个退出条件,其中请求检测到失败(在这种情况下,res可能是未定义的?)然后 that 导致循环退出(可能只是在 res 未定义时导致它返回。)还是我误解了? -
Wyck 我想我和你一样困惑。你会怎么做?
-
问题是,正如 Wyck 所说,
data.length将始终大于 0,假设它开始为非空(如果它开始为空,则循环将永远不会运行)。您似乎想检查实际 API 响应res的长度是否为 0,而不是data,这是您累积所有响应的地方。 -
jacob,介意提交答案吗?我很困惑。
-
我认为您可以解决这个问题 - 也许尝试添加更多控制台日志记录以进行调试会有所帮助。目前在
while循环中有一个console.log- 当你运行它时,它会打印出什么吗?
标签: javascript node.js reactjs next.js