#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(ошибка);