在我的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
})