NodeJS for循环内使用await报SyntaxError: await is only valid in async function错误
问题根因
- 报错
SyntaxError: await is only valid in async function的触发原因是await关键字仅允许在被async修饰的函数内部使用,你的代码中将await doScrape()写在了.then()的普通回调函数中,该回调没有被标记为async,因此语法校验不通过。 - 额外说明:不建议混用
await和.then()链式调用,二者作用都是处理Promise,混用会让代码逻辑变得混乱。
修复方案
方案1:给then回调添加async修饰(最小改动,不推荐长期使用)
将代码的最后一段修改为:
await getProducts(sql) .then(async function (results) { // 此处新增async修饰回调函数 for (var i = 0; i < results.length; i++) { console.log(results[i].productUrl); await doScrape(results[i].productUrl); }; });
方案2:统一使用async/await语法(更推荐,可读性更高)
去掉.then()链式调用,直接用await接收查询结果,代码修改为:
const results = await getProducts(sql); for (let i = 0; i < results.length; i++) { console.log(results[i].productUrl); await doScrape(results[i].productUrl); }
可选优化建议
- 如果不需要按顺序爬取商品,可以用
Promise.all并发执行提升效率:
const results = await getProducts(sql); // 批量生成爬取任务同时执行 await Promise.all(results.map(item => doScrape(item.productUrl)));
- 目前的mysql查询逻辑没有释放连接,长时间运行会出现连接泄漏,建议在查询结束后调用
con.end()关闭连接,或者使用连接池管理mysql连接。
内容的提问来源于stack exchange,提问作者Giles Hunt
相关产品推荐
相关产品推荐

