You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:55:16