2016-06-26 7 views
0

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

У меня есть эта функция, которая предполагает получить пользовательский объект из базы данных MongoUser, обновить его и снова сохранить. Вот мой фрагмент кода:

var changePassword = function(data){ 
     return new Promise(function(fulfill, reject){ 
     MongoUser.findOne({username: data.username}).exec() 
      .then(function(mongoUser){ 
      //mongoUser = new MongoUser(); 
      //mongoUser.username = data.username; 
      mongoUser.password = data.password; 
      mongoUser.save().then(function(){ 
       fulfill(data); 
      }).catch(function(error){ 
       log.error("MongoDB Failed in updating data", {"error": error}); 
       reject(error); 
      }); 
      }) 
      .catch(function(error){ 
      log.error("MongoDB Failed in updating data", {"error": error}); 
      reject(error); 
      }); 
     }); 
}; 

Любая идея, как использовать возвращенное обещание от Mongoose без создания нового?

+0

Вы возвращаете те же данные, что и pass, в качестве аргумента? Это намеренно? –

+1

Думайте, что 'fulfull (data)' совпадает с 'return data' и' reject (error) 'является просто' throw error', поэтому после этого вы можете избавиться от обещания об упаковке. – elclanrs

+1

Не нужно добавлять дополнительные обещания, Mongoos также возвращает обещание –

ответ

4

Mongoose supports promises уже, так что я думаю, что вы можете переписать код так:

var changePassword = function(data) { 
    return MongoUser.findOne({username: data.username}).then(function(mongoUser) { 
    mongoUser = new MongoUser(); 
    mongoUser.username = data.username; 
    mongoUser.password = data.password; 
    return mongoUser.save(); 
    }).catch(function(error){ 
    log.error("MongoDB Failed in updating data", {"error": error}); 
    throw error; 
    }); 
}; 

(хотя я не знаю, почему вы создаете пользователя, который может уже существует).

+0

О, моя ошибка! Я должен использовать метод обновления вместо того, чтобы брать на себя эту проблему. спасибо, что заметили это. – bersam

1

Правильно Сказано: Mongoose поддерживает promises уже. Кроме того, я не думаю, что вам нужно создать нового пользователя с новыми учетными данными, вместо этого вам нужно изменить пароль текущего пользователя. Также я вернул данные при вызове функции «changePassword».

var changePassword = function(data){ 
    return MongoUser.findOne({username: data.username}).exec() 
     .then(function(mongoUser){ 
     mongoUser.username = data.username; 
     mongoUser.password = data.password; 
     return mongoUser.save(); 
     }) 
    .then(function(newSavedData) { 
       return newSavedData; // returns the new saved data 
     }) 
    .catch(function(error){ 
      log.error("MongoDB Failed in updating data", {"error": error}); 
      reject(error); 
     }); 
}; 
+0

Да, мое плохое, это была ошибка. благодаря :) – bersam

Смежные вопросы