如何修改代码实现PostgreSQL结果中URL的同步Lighthouse测试
解决方案
要让Lighthouse测试串行执行(完成一个再跑下一个),需要修改两处核心逻辑:
1. 修正Chrome启动参数的错误配置
原代码中launchChromeAndRunLighthouse函数的flags处理不符合chromeLauncher.launch的参数规范,会导致运行异常。需要把Chrome启动参数放到配置对象的args字段中。
2. 把并发循环改成串行异步循环
原循环会一次性发起所有Lighthouse测试调用,导致并发。需要在循环中使用await等待每个测试完成后再执行下一个。
修改后的完整代码
var objectsFromPg = lighthouse.getRecordsFromPg(); // 将回调改为async函数,支持内部使用await objectsFromPg.then(async pgResults => { // 使用for...of循环配合await实现串行执行 for (const row of pgResults.rows) { await lighthouse.launchChromeAndRunLighthouse(row.url); } }) launchChromeAndRunLighthouse: async function(url, flags = {}, config = null){ console.log("running lighthouse test for ", url); // 修正Chrome启动参数格式:使用配置对象,args字段传启动参数 const chromeConfig = { args: [ '--headless', '--allow-running-insecure-content', '--enable-automation' ] }; const chrome = await chromeLauncher.launch(chromeConfig); // 给Lighthouse的flags添加端口配置 const lighthouseFlags = { ...flags, port: chrome.port }; const results = await lighthouse(url, lighthouseFlags, config); await chrome.kill(); return results; }
关键修改说明
- 串行循环:把原来的普通for循环换成
for...of,并在调用launchChromeAndRunLighthouse前加await,这样每次都会等待当前测试完全结束(包括Chrome进程关闭)后,才会启动下一个URL的测试。 - 修正Chrome启动配置:原代码直接把数组传给
chromeLauncher.launch是错误的,改为传递包含args字段的配置对象,同时分离Chrome启动配置和Lighthouse的flags,避免变量混淆。 - 简化异步逻辑:把原代码中嵌套的
.then改成await写法,让代码更易读,同时确保每一步异步操作都按顺序完成。
内容的提问来源于stack exchange,提问作者Gerg
相关产品推荐
相关产品推荐

