mongoose - 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()
路径不会更新。
解决方案
正在发生的事情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);
推荐阅读
- python - 给定稀疏矩阵的行 id,计算对余弦相似度
- laravel - 如何获取修改后的关系 laravel
- holoviews - 根据 Holoviews 下拉菜单更改工具提示值
- reactjs - 如何创建可编辑的选择字段?
- visual-studio - Nuget 包不会安装
- java - 是否有必要扩展线程类以使用睡眠方法..?
- javascript - 如何更改 Dimple js 网格线样式
- c# - 从 RadTreeView 获取选定的节点 ID(从 Sql Server 填充)
- list - 如何将结果写入列表而不是在序言中打印
- android - 在更新时更改清单 installLocation 参数