首页 > 解决方案 > 当数据不存在时,猫鼬 findOne 卡住了

问题描述

描述

Model.findOne().exec()根据猫鼬文档使用,{ username: ycjcl666 }在我的mongodb中有,当我findOne({ username: 'ycjcl666' }),它可以显示数据,但我查询不存在数据,例如findOne({ username: 'ycjcl888' }),应用程序卡住了。

应用

用于koa@2 + mongoose@^5.0.18 + mongodb@3.6.3创建登录/注册应用程序。

控制器代码:

// controller/user.js
class UserController {
  async login(ctx) { 
    const password = await UserService.loginPass(username);
  }
}

服务代码,就像这样,但它在不存在时卡住了,我try...catch但没有得到console信息

// service/user.js
class UserService {
  async loginPass() {
     return User.findOne({ username }).exec();
  }
 }

// model/user.js
import mongoose from 'mongoose';
import timeZone from 'mongoose-timezone';

const Schema = mongoose.Schema;

const schema = new Schema({
  model: {
    id: String,
    name: String,
  },
  avatar: String,
  username: {
    type: String,
    required: true,
    trim: true,
  },
  password: {
    type: String,
    required: true,
  },
  count: {
    type: Number,
    default: 0,
  },
  updated_at: {
    type: Date,
    default: Date.now,
  },
  created_at: {
    type: Date,
    default: Date.now,
  },
}, {
  // remove __v
  versionKey: false,
  timestamps: {
    createdAt: 'created_at',
    updatedAt: 'updated_at',
  },
});

schema.index({ username: 1 }, { unique: true });
schema.index({
  updated_at: -1,
});

schema.plugin(timeZone);
export default mongoose.model('User', schema);

截屏

在此处输入图像描述

标签: node.jsmongodbmongoosemongoose-schema

解决方案


你使用awaitinawait UserService.loginPass(username);那意味着loginPass必须返回 a Promise,我的意思是你不需要awaitloginPass函数中使用

class UserService {
  loginPass() {
    return User.findOne({ username }).exec();
  }
 }

class UserController {
  async login(ctx) { 
    const password = await UserService.loginPass(username);
  }
}

或者

class UserService {
  async loginPass() {
    return await User.findOne({ username }).exec();
  }
 }

class UserController {
   login(ctx) { 
    const password = UserService.loginPass(username);
  }
}

并确保您没有使用async/await您正在调用的位置UserController.login(如果显式调用)


推荐阅读