我不知道如何使用https
模块使用Node来分页请求。
这就是问题:
给定一个字符串substr
,我必须从电影数据库中检索信息。有多个要检索的页面。
查询应读取https://jsonmock.hackerrank.com/api/movies/search/?Title=substr&page=pageNumber
,替换substr
和pageNumber
。
来自网站的查询响应是具有以下五个字段的JSON响应:
page
: 当前页面
per_page
:每页的最大结果数
total
:搜索结果中的记录总数
total_pages
:要获得所有结果,必须查询的总页数
data
:包含电影信息的JSON对象数组
查询的响应为https://jsonmock.hackerrank.com/api/movies/search/?Title=spiderman&page=1
:
{
"page": "1",
"per_page": 10,
"total": 13,
"total_pages": 2,
"data": [
{
"Title": "Italian Spiderman",
"Year": 2007,
"imdbID": "tt2705436"
},
... //9 more responses
]
}
这是一种方法,尽管我查询了第一页:
const https = require('https');
const getMovieTitles = (substr) => {
let currentPage = 1;
https.get(
`https://jsonmock.hackerrank.com/api/movies/search/?Title=${substr}&page=${currentPage}`,
(res) => {
console.log(res.statusCode);
let all_chunks = [];
res.setEncoding('utf8');
let rawData = '';
res.on('data', (chunk) => {
rawData += chunk;
});
res.on('end', () => {
const parsedData = JSON.parse(rawData);
console.log(parsedData);
});
}
);
};
该getMoviTitles
函数应返回一个字符串数组:
[
"Italian Spiderman",
"Superman, Spiderman or Batman",
"Spiderman",
"Spiderman",
"Fighting, Flying and Driving: The Stunts of Spiderman 3",
"Spiderman and Grandma",
"The Amazing Spiderman T4 Premiere Special",
"Amazing Spiderman Syndrome",
"Hollywood's Master Storytellers: Spiderman Live",
"Spiderman 5",
"They Call Me Spiderman",
"The Death of Spiderman",
"Spiderman in Cannes"
]
那么,如何遍历page
参数并处理接收到的数据?
拉动页面后,getMovieTitles()
应该检查是否还有更多页面-如果是,请循环至下一页,直到所有页面都被下载为止。
我添加了新的内部函数loadNextPage()
来对您的代码进行实际工作,并将结果累积在dataUntilNow
:
const https = require('https');
function getMovieTitles(substr) {
let currentPage = 0;
let dataUntilNow = [];
function loadNextPage() {
currentPage++;
console.log(`Fetching page ${currentPage}`);
https.get(
`https://jsonmock.hackerrank.com/api/movies/search/?Title=${substr}&page=${currentPage}`,
(res) => {
console.log(res.statusCode);
let all_chunks = [];
res.setEncoding('utf8');
let rawData = '';
res.on('data', (chunk) => {
rawData += chunk;
});
res.on('end', () => {
const parsedData = JSON.parse(rawData);
dataUntilNow.splice(-1, 0, ...parsedData.data);
const parsedPage = parseInt(parsedData.page);
if (!isNaN(parsedPage) && typeof parsedData.total_pages == 'number' && parsedPage < parsedData.total_pages)
loadNextPage();
else
console.log(dataUntilNow.map(e => e.Title));
});
}
);
};
loadNextPage();
}
getMovieTitles('spiderman');
这会将期望的结果输出到控制台。如果要返回结果,则必须使用回调或Promise,因为它将异步可用。
例如:
function getMovieTitles(substr, next) {
...
else
next(dataUntilNow.map(e => e.Title));
...
getMovieTitles('spiderman', console.log);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句