Node.js中调用OMDb API如何获取超过默认10条的返回结果?
解决方案
OMDb API本身默认单页最大仅返回10条结果,没有原生参数支持单次调用返回20条,最高效的实现方式是后端并发请求2页OMDb接口,合并结果后统一返回,整体耗时和单次请求接近,不会产生额外的串行等待开销。
代码优化点说明
- 改用axios的
params配置自动处理参数编码,避免搜索关键词含特殊字符时请求出错 - 用
Promise.all并发请求两页数据,性能最优 - 新增错误捕获逻辑,避免接口异常直接崩溃
- 去掉多余的
JSON.parse(JSON.stringify)冗余操作,axios已自动解析接口返回的JSON数据
修改后代码
const axios = require('axios'); exports.getMovieFromApi = async (req, res) => { try { // 前端传入的1页对应OMDb的2页,比如前端page=1对应OMDb第1、2页,page=2对应OMDb第3、4页 const basePage = req.query.page ? parseInt(req.query.page) : 1; const omdbPage1 = basePage * 2 - 1; const omdbPage2 = basePage * 2; // 并发请求两页数据,耗时和单次请求几乎一致 const [res1, res2] = await Promise.all([ axios.get('http://www.omdbapi.com/', { params: { apikey: process.env.API_KEY, s: req.query.s, page: omdbPage1 } }), axios.get('http://www.omdbapi.com/', { params: { apikey: process.env.API_KEY, s: req.query.s, page: omdbPage2 } }) ]); // 合并两页搜索结果 const mergedData = { ...res1.data, Search: [...(res1.data.Search || []), ...(res2.data.Search || [])] }; res.status(200).json({ data: mergedData }); } catch (err) { res.status(500).json({ error: '获取电影数据失败', message: err.message }); } };
注意事项
- 如果搜索结果总条数不足20条,会自动返回所有可获取的结果,不会报错
- 如果需要支持自定义返回条数,可以调整并发请求的页数即可,比如要30条就并发请求3页
- 并发请求和串行请求消耗的OMDb接口配额一致,不会额外增加调用次数
内容的提问来源于stack exchange,提问作者Archosan
相关产品推荐
相关产品推荐

