Мне нужно MongoDB, чтобы дождаться хука перед удалением, прежде чем делать другие действия - PullRequest
0 голосов
/ 06 июля 2018

Я довольно новичок в работе с MongoDB (или любой другой базой данных в этом отношении), и у меня есть ошибка в моем веб-приложении диспетчера расходов.

У меня есть несколько коллекций ( не коллекций MongoDB, я их так называю на веб-сайте), которые пользователь может удалить. После удаления коллекции из базы данных (и всех ссылок на эту коллекцию) я извлекаю все остальные коллекции.

Проблема в том, что сервер уже извлекает коллекции, прежде чем удаляется коллекция, которую предполагается удалить.

Это то, что появляется в моем терминале, когда я пытаюсь удалить коллекцию:

Mongoose: collections.findOne({ _id: ObjectId("5b3f5dc890a1702e96a8f59a") }, { fields: {} })
Mongoose: collections.findOne({ _id: ObjectId("5b3f5dc890a1702e96a8f59a") }, { fields: {} })
Mongoose: users.findOne({ _id: ObjectId("5b321af4b654523b93164187") }, { fields: {} })
Mongoose: collections.find({ user: ObjectId("5b321af4b654523b93164187") }, { fields: {} })
Mongoose: expenses.remove({ _collection: ObjectId("5b3f5dc890a1702e96a8f59a") }, {})
Mongoose: users.updateOne({ _id: ObjectId("5b321af4b654523b93164187") }, { '$pullAll': { collections: [ ObjectId("5b3f5dc890a1702e96a8f59a") ] }, '$inc': { __v: 1 } })
Mongoose: collections.remove({ _id: ObjectId("5b3f5dc890a1702e96a8f59a") }, {})

Я пытался выяснить, как ждать окончания крючка, но ничего не смог найти. Я даже не знаю, правильно ли это делать в моем случае, поэтому я решил спросить здесь.

Это мой крюк:

collectionSchema.pre('remove', async function(next) {
  try {
    let user = await User.findById(this.user);
    user.collections.remove(this.id);

    this.model('Expense').remove({ _collection: this.id }, next);

    await user.save();

    return next();
  } catch(err) {
    return next(err);
  }
});

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Оказывается, проблема связана с функцией, которую я использовал для удаления коллекции.

Видимо, я использовал магический код voo-doo, который я не понял. Ответ @ estus заставил меня снова просмотреть свой код и найти правильный способ удаления документа:

await db.Collection.findByIdAndRemove(req.params.collection_id);

Спасибо!

0 голосов
/ 06 июля 2018

remove(...) обещания не связаны должным образом внутри функции async. Другая проблема состоит в том, что функция async возвращает обещание, а next избыточна с обещаниями, по крайней мере, в Mongoose 5.

Это должно быть что-то вроде:

collectionSchema.pre('remove', async function() {
    let user = await User.findById(this.user);
    await user.collections.remove(this.id);    
    await this.model('Expense').remove({ _collection: this.id });
    await user.save();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...