Найдите один элемент, используйте данные, затем удалите его

#javascript #node.js #mongodb #mongoose

#javascript #node.js #mongodb #мангуст

Вопрос:

В моем node.js приложение, в котором я в настоящее время внедряю функцию «Запомни меня». Пока все работает довольно хорошо, но у меня проблема с mongoose. Что я хочу сделать: у меня есть модель с именем Token с этой схемой:

 var TokenSchema = mongoose.Schema({
    token: { type: String },
    uid: { type: Schema.Types.ObjectId, ref: 'User' }
});
 

Это просто небольшая коллекция, которая сопоставляет токены cookie с идентификатором пользователя. Тогда у меня есть эта функция здесь:

 function consumeRememberMeToken(token, fn) {
  Token
  .findOne({ 'token': token }, (err, result) => {
    return (result===null)?fn(null, null):fn(null, result.uid);
  })
  .remove();
}
 

Что он должен делать, так это: найдите uid для заданной token строки и верните ее (если есть результат). Но эта функция также должна удалять запись сразу после возврата uid .

На данный момент uid из найденного токена result возвращается правильно, но он (результирующий токен) не удаляется из коллекции с помощью приведенного выше кода. Я не понимаю, как удалить его сразу после его получения и использования извлеченного uid . Я совершенно новичок в функциональном программировании и не понимаю, как и где удалить токен.

Ответ №1:

Вы можете попробовать db.collection.findOneAndDelete , он удаляет документ и возвращает удаленные данные, совершенно противоположно тому, что вы говорите, но в основном служит вашей цели. вот подробности.

Также здесь представлено то же самое в mongoose.

Ответ №2:

  Token.findOne({ 'token': token }, (err, result) => {
   if(err || !result) return fn(err || "error", null);
   else{
      var uid = result.uid;
      result.remove(function(){
         return fn(null, uid);
      });
  }
})
 

Комментарии:

1. Извините, но это не работает … uid возвращается, но токен не удаляется. Другими словами: после выполнения вышеописанного в коллекции теперь есть 2 записи с одинаковым uid , но разными строками токенов. Каждый вызов добавляет одну запись.

2. Добавьте параметр ошибки в remove callback и проверьте его, result.remove(функция (ошибка){ console.log(ошибка);