.save()方法的异常行为



我正在创建一个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 !

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

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

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

最新更新