【问题标题】:.save() method of Mongoose behaving unexpectedlyMongoose 的 .save() 方法行为异常
【发布时间】:2020-08-03 03:43:41
【问题描述】:

我正在创建一个 API 来存储用户,允许用户根据用户名和密码登录、阅读他们的个人资料等。

路线均已成功构建,但在使用“Supertest”库测试 api 期间,我发现了一些问题。

我尝试按如下方式创建用户实例 userOne(在调用 beforeEach 方法之前):

//Creating a mock user for testing
const userOneId = new mongoose.Types.ObjectId()
const userOne = new User({
    _id: userOneId,
    name: 'Temp-user',
    email: 'tempuser@gmail.com',
    password: 'tempuser',
    age:40,
    tokens: [{
        token: jwt.sign({_id:userOneId},process.env.JWT_SECRET)
    }]
})
 
beforeEach(async ()=>{
    try{
    await User.deleteMany()
    await userOne.save()
    }catch(e){
        console.log('BeforeEach error: ',e)
    }

这使我的测试失败,beforeEach 抛出以下错误:

  BeforeEach error:  DocumentNotFoundError: No document found for query "{ _id: 5f2570846592c22d641e3247 }" on model "User"
        at /home/priyank_linux/Desktop/node-course/task-manager/node_modules/mongoose/lib/model.js:323:38
        at processTicksAndRejections (internal/process/task_queues.js:97:5) {
      result: undefined,
      numAffected: undefined,
      filter: { _id: 5f2570846592c22d641e3247 },
      query: { _id: 5f2570846592c22d641e3247 }
    }

> 但是,当我尝试在每次测试之前保存用户的以下方法时,我的所有测试都通过了

//Creating a mock user for testing
const userOneId = new mongoose.Types.ObjectId()
const userOne = {
    _id: userOneId,
    name: 'Temp-user',
    email: 'tempuser@gmail.com',
    password: 'tempuser',
    age:40,
    tokens: [{
        token: jwt.sign({_id:userOneId},process.env.JWT_SECRET)
    }]
}
 
beforeEach(async ()=>{
    try{
    await  User.deleteMany()
     //creating and saving the user instance at the same time
    await new User(userOne).save()    
    }catch(e){
        console.log('BeforeEach error: ',e)
    }
    
})
 
//All tests passed successfully !

我的问题是,为什么当我创建并保存一个 同时用户模型,我没有找到找不到文档 错误(这意味着保存的文档实际上正在获取 存储在数据库中)。我哪里错了?

【问题讨论】:

    标签: node.js mongoose supertest


    【解决方案1】:

    这是我从 Udemy 收到的答案,我相信它是 100% 准确的:

    由于您在第一个示例中只创建了一个文档,看起来 Mongoose 正在尝试为第一个之后的所有保存调用更新现有文档。问题是它被删除了。所以本地文档认为已经保存了,但是保存的版本在幕后被删除了。

    【讨论】:

      猜你喜欢
      • 2019-05-12
      • 2014-10-27
      • 2018-04-08
      • 1970-01-01
      • 2014-02-17
      • 2017-12-30
      • 2017-08-02
      相关资源
      最近更新 更多