迁移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
相关产品推荐
相关产品推荐

