Mongoose Обновление документа даже без функции save () - PullRequest
1 голос
/ 05 апреля 2019

Я использую экспресс.У меня есть пути к файлам в MongoDb, до отправки ответа от Api.Я добавляю 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() путь не обновляется.

1 Ответ

1 голос
/ 05 апреля 2019

Происходит следующее: 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);
...