2017-01-02 15 views
0

Так что я недавно начал изучать обещания (Bluebird), и теперь я стараюсь использовать их как можно больше, но я немного смущен, если мне нужно вернуть обещания в этом случае.Confused о обещаниях. Мне нужно вернуться сюда?

Здесь у меня есть паспорт LocalStrategy, что я сделал:

passport.use(new LocalStrategy(function(username, password, done) { 
    users.get(username) // A 
     .then(function(user) { 
      if (!user) { 
       return done(null, false, { message: 'Incorrect username.' }); 
      } 
      bcrypt.compare(password, user.password).then(function(result) { // B 
       if (result) { 
        return done(null, user); 
       } 
       return done(null, false, { message: 'Incorrect password.' }); 
      }); 
     }) 
     .catch(function(err) { 
      return done(err); 
     }); 
})); 

users.get(username) на линии А использует pg-promise библиотеку, чтобы вернуть обещание, что будет решать в пользователя, если один находится в базе данных, и ложь, если пользователь не был найден.

bcrypt.compare В строке B используется bcrypt, чтобы проверить, соответствуют ли пароль и хэш. Он возвращает обещание, которое разрешит true или false.

код работает отлично, я просто запутаться, если линия А и B должен вернуться, как так

return users.get(username) // A 

return bcrypt.compare(password, user.password).then(function(result) { // B 

код работает и без возврата обещаний.

Is Passport/Node только ждет, пока не увидит return done? Означает ли это, что эта функция синхронна, хотя все внутри нее асинхронно? Обычно вы возвращаете обещание, а затем используете .then(), но так как LocalStrategy не использует .then() или .catch() Мне ничего не нужно возвращать? Любой вход очень приветствуется. Благодарю.

+0

По крайней мере, связанные с: http://stackoverflow.com/questions/23920589/how-to-pass-a-third-argument-to-a- callback-using-bluebird-js-nodeify – Tomalak

+0

Я нашел, что это действительно хорошая статья, объясняющая путаницы с обещаниями [У нас проблема с обещаниями] (https://pouchdb.com/2015/05/18/we-have- a-problem-with-promises.html) – ivn

+0

Tomalak, ivn: Спасибо, собираюсь проверить их. – Nikokin

ответ

0

Паспорт не поддерживает Promise, поэтому вы должны сделать вызов в обратном вызове. Вы могли бы return users.get(username), но возвращаемое значение (обещание) никогда не используется. Не забывайте, что вы можете обещание цепи, как следующее:

users.get(username) 
    .then(function(user) { 
     if (!user) { 
      return done(null, false, { message: 'Incorrect username.' }); 
     } 
     return bcrypt.compare(password, user.password); 
    }) 
    .then(function(result) { // B 
     if (result) { 
      return done(null, user); 
     } 
     return done(null, false, { message: 'Incorrect password.' }); 
    }) 
    .catch(function(err) { 
     return done(err); 
    }); 
+0

Хорошо спасибо. Я подумал, что это, вероятно, не имеет значения в этом случае, поскольку Паспорт не волнует. Мне просто интересно, есть ли какой-нибудь вред в возвращении или нет, но я думаю, нет. Причина, по которой я не привязан цепью, как в вашем примере, состоит в том, что bcrypt.compare не возвращает пользователя, он просто возвращает true или false, поэтому я не могу вернуть пользователя после того, как я .then() users.get (имя пользователя). – Nikokin