首页 > 解决方案 > Mongoose 更新文档甚至不运行 save() 函数

问题描述

我正在使用快递。在从 Api 发送响应之前,我在 MongoDb 中有文件路径。我在 api Url 前面加上文件路径,例如

song.path = url + song.path;
res.send(song);

但是这样做的原因是它也更新了 mongodb 中的路径,即使我没有保存这个文档,我只是发送响应

我努力了

const newSong = song;
newSong.path = url + newSong.path;
res.send(newSong)

;

但这没有帮助,文档仍在更新。

这是我的控制器

    const song = await Song.findOne({ 'lastPlayed': false }).sort("-totalRating");
    song.lastPlayed = true;
    song.save();
    song.path = url + song.path;
    res.send(song);

它应该只更新响应的属性..而不是在 Db

更新

如果我注释掉song.save()路径不会更新。

标签: mongoosedocumentupdating

解决方案


正在发生的事情doc.save()是异步的,当您改变对象并发送响应doc.save()仅在主线程之后执行时,这就是为什么song.path = url + song.path;即使您认为之前保存它也会复制到 mongoDB 的原因。

您可以为响应创建一个新对象

const song = await Song.findOne({ 'lastPlayed': false }).sort("-totalRating");
song.lastPlayed = true;
song.save();
res.send({ ...song, path: url + song.path });

或者您可以await保存然后改变响应的对象,如果您想在发送响应之前处理错误,这很好。

const song = await Song.findOne({ 'lastPlayed': false }).sort("-totalRating");
song.lastPlayed = true;
await song.save();
song.path = url + song.path;
res.send(song);

推荐阅读