如何在mongoose findOneAndUpdate完成更新后运行回调



在我的API中,我使用express的app.put方法,在集合中使用mongoose的findOneAndUpdate方法搜索具有特定标题的文档并更新它。


app.put("/articles/:articleTitle",(req, res) => {
Article.findOneAndUpdate({
title: req.params.articleTitle
}, {
title: req.body.title,
content: req.body.content
}, (err, foundArticle) => {
err ? res.send("Error !") : foundArticle ? res.send("Article found.Updating...") : res.send("NO articles found to update!")
})
})

如何在更新完成后运行回调函数,并返回更新后的文档?我试图在findOneAndUpdate方法的末尾添加一个.then,但它给我带来了这样的错误:"MongooseError:查询已执行:Article.findOneAndUpdate…">

我还尝试在一个变量中传递该方法的返回值,并在.then中访问它,但它抛出了相同的错误,如下所示:


app.put("/articles/:articleTitle",(req, res) => {

const doc = Article.findOneAndUpdate({
title: req.params.articleTitle
}, {
title: req.body.title,
content: req.body.content
},{returnDocument: 'after'}, (err, foundArticle) => {
err ? res.send("Error !") : foundArticle ? res.send("Article found.Updating...") : res.send("NO articles found to update!")
}).then( () =>{ console.log(doc) })

})

EDIT:似乎当我简单地添加选项returnDocument: 'after'作为参数时,它使我可以访问";在";文档内部有自己的方法回调,嗯,我必须检查文档,但如果有人知道这样做的常见做法,我将不胜感激


Article.findOneAndUpdate({
title: req.params.articleTitle
}, {
title: req.body.title,
content: req.body.content
},{returnDocument: 'after'}, (err, foundArticle) => {
err ? res.send("Error !") : foundArticle ? res.send(foundArticle) : res.send("NO articles found to update!")
})

根据文档,findOneAndUpdate():

[…]查找与给定文档匹配的第一个文档筛选,应用更新并返回文档。默认情况下,findOneAndUpdate((返回以前的文档已应用更新

要实际返回更新的文档,文档建议执行以下操作:

您应该将新选项设置为true,以便在已应用更新。

方法的第三个参数是可选的options对象,其中new参数可以设置为true,以便实际返回更新的文档。

要在方法调用后实际访问更新的文档,有多种方法

示例1:使用async/await语法

const doc = await Article.findOneAndUpdate(
{ title: req.params.articleTitle },
{
title: req.body.title,
content: req.body.content
},
{ new: true }
)
doc.title // equals value of req.body.title

示例2:使用.then()语法

Article.findOneAndUpdate(
{ title: req.params.articleTitle },
{
title: req.body.title,
content: req.body.content
},
{ new: true }
).then((err, doc) => {
console.log(doc.title) // equals value of req.body.title
})

示例3:使用回调语法

Article.findOneAndUpdate(
{ title: req.params.articleTitle },
{
title: req.body.title,
content: req.body.content
},
{ new: true },
(err, doc) => {
console.log(doc.title) // equals value of req.body.title
})

最新更新