在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
相关产品推荐
相关产品推荐

