使用 findOneAndUpdate 时出现猫鼬错误
Mongoose Error when using findOneAndUpdate
我在更新笔记时在我的服务器控制台收到一个错误 collection,更新成功但我在我的服务器控制台收到此错误,感觉有问题。提前致谢
app.put("/todos/:id", async(req,res) => {
try {
// console.log(req.body);
const { id } = req.params;
const { title, content } = req.body.edit;
const edit = await Note.findOneAndUpdate({_id:id}, {
title: title,
content: content
},
function (err, docs) {
if(!err){
console.log("Successfully edit item:" + docs);
const response = res.json(docs);
}else{
console.error(err);
}
})
// Example: Update name to Gourav
// User.findByIdAndUpdate(user_id, {
// name: 'Gourav'
// },
// function (err, docs) {
// if (err) {
// console.log(err)
// } else {
// console.log("Updated User : ", docs);
// }
// });
} catch (error) {
console.error(error);
}
});
错误消息:
MongooseError: Query was already executed: Note.findOneAndUpdate({
_id: new ObjectId("61580e469338c1fc3...
at model.Query._wrappedThunk [as _findOneAndUpdate] (C:\Users\xx\Desktop\MernToDoV3\server\node_modules\mongoose\lib\helpers\query\wrapThunk.js:21:19)
at C:\Users\xx\Desktop\MernToDoV3\server\node_modules\kareem\index.js:370:33
at processTicksAndRejections (internal/process/task_queues.js:77:11) { originalStack: 'Error\n' +
' at model.Query._wrappedThunk [as _findOneAndUpdate] (C:\Users\xx\Desktop\MernToDoV3\server\node_modules\mongoose\lib\helpers\query\wrapThunk.js:25:28)\n'
+
' at C:\Users\xx\Desktop\MernToDoV3\server\node_modules\kareem\index.js:370:33\n'
+
' at processTicksAndRejections (internal/process/task_queues.js:77:11)' }
你可以这样做。您不需要使用回调,而是使用 async/await 或 then/catch.
当您将 try/catch 应用于异步代码时,效果并不理想。它们通常用于在代码通过不同方式同步时捕获错误。 Promises 提供了一种使用 catch 运算符捕获错误的方法。
app.post("/todos", async (req,res)=>{
try{
// const small = new Tank({ size: 'small' });
// small.save(function (err) {
// if (err) return handleError(err);
// // saved!
// });
console.log(req.body); //should use console to see
const { title, content} = req.body.newNote,
noteInput = new Note({title, content });
const result = await noteInput.save();
if (result) {
// check if the result exist else do something
// if you don't find anything
}
}catch(err){
// any errors in the save will be catch here automatically
console.error(err.message);
}
});
注意:当您将函数设为异步时,您需要使用 await 关键字来等待函数中异步部分的结果。
我对这个查询有类似的问题 query.limit(resPerPage).skip(skip)
。
我链接了 clone()
并且成功了
query.limit(resPerPage).skip(skip).clone()
我在更新笔记时在我的服务器控制台收到一个错误 collection,更新成功但我在我的服务器控制台收到此错误,感觉有问题。提前致谢
app.put("/todos/:id", async(req,res) => {
try {
// console.log(req.body);
const { id } = req.params;
const { title, content } = req.body.edit;
const edit = await Note.findOneAndUpdate({_id:id}, {
title: title,
content: content
},
function (err, docs) {
if(!err){
console.log("Successfully edit item:" + docs);
const response = res.json(docs);
}else{
console.error(err);
}
})
// Example: Update name to Gourav
// User.findByIdAndUpdate(user_id, {
// name: 'Gourav'
// },
// function (err, docs) {
// if (err) {
// console.log(err)
// } else {
// console.log("Updated User : ", docs);
// }
// });
} catch (error) {
console.error(error);
}
});
错误消息:
MongooseError: Query was already executed: Note.findOneAndUpdate({ _id: new ObjectId("61580e469338c1fc3... at model.Query._wrappedThunk [as _findOneAndUpdate] (C:\Users\xx\Desktop\MernToDoV3\server\node_modules\mongoose\lib\helpers\query\wrapThunk.js:21:19) at C:\Users\xx\Desktop\MernToDoV3\server\node_modules\kareem\index.js:370:33 at processTicksAndRejections (internal/process/task_queues.js:77:11) { originalStack: 'Error\n' + ' at model.Query._wrappedThunk [as _findOneAndUpdate] (C:\Users\xx\Desktop\MernToDoV3\server\node_modules\mongoose\lib\helpers\query\wrapThunk.js:25:28)\n' + ' at C:\Users\xx\Desktop\MernToDoV3\server\node_modules\kareem\index.js:370:33\n' + ' at processTicksAndRejections (internal/process/task_queues.js:77:11)' }
你可以这样做。您不需要使用回调,而是使用 async/await 或 then/catch.
当您将 try/catch 应用于异步代码时,效果并不理想。它们通常用于在代码通过不同方式同步时捕获错误。 Promises 提供了一种使用 catch 运算符捕获错误的方法。
app.post("/todos", async (req,res)=>{
try{
// const small = new Tank({ size: 'small' });
// small.save(function (err) {
// if (err) return handleError(err);
// // saved!
// });
console.log(req.body); //should use console to see
const { title, content} = req.body.newNote,
noteInput = new Note({title, content });
const result = await noteInput.save();
if (result) {
// check if the result exist else do something
// if you don't find anything
}
}catch(err){
// any errors in the save will be catch here automatically
console.error(err.message);
}
});
注意:当您将函数设为异步时,您需要使用 await 关键字来等待函数中异步部分的结果。
我对这个查询有类似的问题 query.limit(resPerPage).skip(skip)
。
我链接了 clone()
并且成功了
query.limit(resPerPage).skip(skip).clone()