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

迁移Hapi项目至v17时,使用Mongoose async/await遇语法错误求助

解决await is only valid in async function语法错误

这个报错其实和Mongoose、Hapi版本关系不大,是JavaScript的基础规则限制——await关键字只能在标记为async的函数内部使用。你现在的问题肯定是调用await User.findOne(...)的那个外层函数没有加上async声明。

举个具体的例子,比如你在Hapi路由的handler里写了这段代码,原来的写法可能是这样(错误示例):

server.route({
  method: 'GET',
  path: '/users/{email}',
  handler: function(request, h) {
    // 这里用了await,但handler函数不是async的,所以报错
    const result = await User.findOne({email: request.params.email}).exec();
    return h.response(result);
  }
});

只要把handler函数改成async函数就能解决问题:

server.route({
  method: 'GET',
  path: '/users/{email}',
  // 给handler函数加上async修饰符
  handler: async function(request, h) {
    const result = await User.findOne({email: request.params.email}).exec();
    return h.response(result);
  }
});

如果是用箭头函数写法,同样要加async:

handler: async (request, h) => {
  const result = await User.findOne({email: request.params.email}).exec();
  return h.response(result);
}

再延伸一下,如果你是在自定义函数里调用Mongoose的方法,同样要给这个自定义函数加async:

// 错误写法:函数没加async,内部用await会报错
function fetchUserByEmail(email) {
  const user = await User.findOne({email}).exec();
  return user;
}

// 正确写法
async function fetchUserByEmail(email) {
  const user = await User.findOne({email}).exec();
  return user;
}

你的Node v10.2.0完全支持async/await语法,Mongoose 5.1.2的exec()也确实会返回Promise,所以这两个工具的版本都没问题,核心就是确保所有使用await的代码都包裹在async函数里。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:15:43