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

在Express中无法运行async异步函数、单独运行正常该如何修复?

问题原因及修复方案

核心问题点

  • 数组长度属性拼写错误:JavaScript 数组的长度属性为小写的length,代码中错误写为links.Length,读取结果为undefined,导致for循环判断条件永远不成立,截图逻辑直接跳过,这是功能不生效的首要原因。
  • 变量未声明作用域:siteName、links、pageNumber、currentLink等变量均未添加const/let声明,默认成为全局变量,并发请求时会出现变量覆盖的异常。
  • 缺少错误捕获逻辑:异步函数执行抛出的异常没有被捕获,会导致Express请求挂起无响应,也无法定位具体报错。
  • Puppeteer 环境适配:如果服务部署在无图形界面的Linux环境,需要手动指定无头模式启动,避免浏览器启动失败。

修复后完整代码

const path = require('path')
const fs = require('fs')
const puppeteer = require('puppeteer');
const express = require('express');
const bodyParser = require('body-parser');

const app = express()
const port = 9596;
app.use(bodyParser.json());
  
app.post('/', async function(req, res){
    try {
        // 声明变量作用域
        const siteName = req.body.siteName;
        const links = req.body.links;
        const screenshotPageSource = req.body.screenshotPageSource;
        // 新增参数校验避免非法输入
        if (!Array.isArray(links) || links.length === 0) {
            return res.status(400).end('links参数必须为非空数组');
        }
        await createScreenshots(siteName, links, screenshotPageSource);
        res.end('截图任务执行完成');
    } catch (err) {
        console.error('请求处理失败:', err);
        res.status(500).end('服务执行异常');
    }
});
  
app.listen(port, () => {
    console.log(`Example app listening at http://localhost:${port}`)
})


async function createScreenshots(siteName, links, screenshotPageSource){
    const browser = await puppeteer.launch({
        defaultViewport: { width: 1366, height: 768 },
        // 无图形界面环境必须开启无头模式
        headless: 'new'
    });
    const page = await browser.newPage();
    // 修正为小写length
    const linksLength = links.length;

    for (let i = 0; i < linksLength; i++) {
        const link = links[i]
        let currentLink;
        if(screenshotPageSource){
            currentLink = `view-source:${link}`;
        } else {
            currentLink = link;
        }
    
        const pageNumber = i + 1;
        console.log(`开始处理第${pageNumber}页: ${currentLink}`);

        try {
            await page.goto(currentLink, {waitUntil: 'load', timeout: 60000});
            console.log(`Страница ${pageNumber}/${linksLength}, удалось сделать скриншот.`)
            await page.screenshot({ path: `${siteName}__${pageNumber}.png` });
        } catch (err) {
            console.log(`Страница ${pageNumber}/${linksLength}, не удалось сделать скриншот. 错误信息: ${err.message}`)
        }
    }
    
    await browser.close();
    return links;
};

验证步骤

  • 发起POST请求时确保Content-Type为application/json,请求body中携带符合格式的siteName、links参数
  • 查看控制台输出,确认循环逻辑正常执行,如有报错可直接根据错误信息定位问题

内容的提问来源于stack exchange,提问作者WhyIsThatHappening

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:57:03