Express Node.js中Cheerio爬取IMDB返回空数组问题求助
问题解决:异步请求导致返回空数组
问题原因
你遇到的是典型的异步代码执行顺序问题:axios发起的HTTP请求是异步操作,当你执行return res.status(200).json(items)时,.then回调内的爬取逻辑还未执行,items仍为初始空数组,所以接口返回空数据。
解决方案
利用你已经声明的async方法,通过await等待axios请求完成,确保数据爬取完成后再返回响应,避免回调嵌套导致的时序问题。
修改后的代码如下:
import * as cheerio from 'cheerio'; import { Request, Response } from "express"; import axios from 'axios'; class ScrappingRaking { async index(req: Request, res: Response) { const items: object[] = []; try { // 用await等待axios请求完成,避免回调嵌套 const axiosRes = await axios("https://www.imdb.com/chart/tvmeter/?ref_=nv_tvv_mptv"); const data = axiosRes.data; const $ = cheerio.load(data); // 遍历前15条数据填充items [...$('.lister-list>tr')].forEach((e, i) => { if (i < 15) { const ranking = i + 1; const title = $(e).find('.titleColumn a').text().trim(); const year = $(e).find('.titleColumn span').text().trim(); items.push({ranking, title, year}); } }); // 此时items已填充完成,返回响应 return res.status(200).json(items); } catch (err) { return res.status(500).json({ error: err instanceof Error ? err.message : '未知错误' }); } } } export default new ScrappingRaking();
关键修改点
- 用
await替代.then回调,让代码按同步逻辑执行,等待请求完成后再处理数据 - 重命名axios响应变量为
axiosRes,避免和Express的res对象冲突 - 把
map改为forEach(因为你不需要返回新数组,只是遍历填充items) - 优化错误返回,确保返回的错误信息更清晰
内容的提问来源于stack exchange,提问作者Routfin
相关产品推荐
相关产品推荐

