Mongoose findOne调用使用await与不使用await的异步同步差异是什么
Mongoose 两种
findOne 调用方式的差异详解 首先给出两种写法的代码示例:
// 写法1:不带await var users = Users.findOne({key}) // 写法2:带await var users = await Users.findOne({key})
1. 执行逻辑差异
- 不带
await的调用:findOne执行后不会立刻发起数据库查询,仅返回一个Mongoose内置的Query查询对象。你可以继续在这个对象上链式调用sort、where、limit等方法拼接查询逻辑,只有当你主动调用.exec()方法、传入回调函数,或者用await修饰该对象时,才会真正向数据库发起查询请求。且代码不会等待查询完成,会直接执行后续逻辑。 - 带
await的调用:会自动触发查询对象的执行,当前代码会等待数据库返回结果(或抛出查询错误)后,才会继续执行后续逻辑,本质是Mongoose Query对象内置Promise实现的语法糖。注意await必须在被async关键字修饰的函数内部使用,否则会触发语法错误。
2. 返回结果差异
- 不带
await:返回值是Mongoose的Query实例,并非你查询的业务数据。直接访问该返回值的文档属性(比如users.name)会得到undefined,这也是很多新手容易踩的典型坑。 - 带
await:返回值是数据库查询匹配到的文档对象,没有匹配结果时返回null;如果查询过程出现报错(比如数据库连接异常、权限不足),会直接抛出异常,需要搭配try/catch捕获处理。
3. 适用场景差异
- 不带
await的适用场景:- 需要动态拼接查询条件的场景:比如需要根据不同的业务参数,判断是否要追加排序、关联查询、过滤条件,最后再统一执行查询
- 习惯用回调方式处理异步逻辑的场景:可以直接在
findOne的第二个参数传入回调函数处理结果
- 带
await的适用场景:- 绝大多数常规业务查询场景:需要拿到查询结果后再执行后续逻辑,异步逻辑写法扁平易读,比回调或
.then链式调用的可维护性更高
- 绝大多数常规业务查询场景:需要拿到查询结果后再执行后续逻辑,异步逻辑写法扁平易读,比回调或
内容的提问来源于stack exchange,提问作者JANATI MOHAMMED
相关产品推荐
相关产品推荐

