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

后端API函数内使用await触发语法错误的解决方案

报错根因

抛出该语法错误的直接原因是await关键字被写在了new Promise()传入的普通同步回调函数内部,该回调未声明为async,不符合JavaScript语法规则。
同时代码存在典型的冗余Promise包装反模式:getUser本身已经是async函数,执行后天然返回Promise实例,完全不需要手动再包裹一层new Promise,这种多余包装不仅会拖慢执行效率,还容易导致错误被吞、上下文丢失。

规范异步写法修正

service.js 修正

移除多余的Promise包装,直接在async函数内使用await执行数据库查询,同时补充数据库查询逻辑的注意点:

module.exports = {
  getUser
};

async function getUser({ data }) {
  const id = data["id"];
  const doc = await db.collection('users').where('id', '==', id).get();

  // 注意:多数云数据库的where条件查询返回的是多文档QuerySnapshot,不存在单文档的exists属性
  // 如果是按主键查询单个用户,建议替换为 db.collection('users').doc(id).get() 拿到单文档快照后再判断exists
  if (!doc.exists) {
    return 'No such document!';
  }
  return doc.data();
}

controller.js 修正

统一使用async/await写法,避免和.then()混写增加维护成本,同时增加错误捕获逻辑,避免接口异常时无响应:

async function getUser(req, res, next) {
  try {
    const userData = await userService.getUser({ data: req.body });
    res.json(userData);
  } catch (err) {
    // 将错误传递给全局错误处理中间件统一处理
    next(err);
  }
}
异步编码注意事项
  • async函数本身会返回Promise实例,函数内return的值会作为Promise成功态的返回值,函数内抛出的错误会作为Promise失败态的原因,不需要手动实例化Promise包装。
  • 禁止给new Promise的executor回调加async标记:这种写法下回调内部抛出的错误不会被Promise的reject捕获,会直接触发全局未捕获异常。
  • 异步逻辑尽量保持写法统一,不要混用async/await和Promise链式调用,降低代码理解成本。
  • 所有await调用都需要配套错误捕获,要么在当前函数用try/catch处理,要么把错误抛给上层中间件统一处理,避免请求挂起。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:21:18