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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:54:00