Разница между 'done' и 'next' в node.js обратных вызовах

в паспортной документации [configure authentication], он имеет довольно страшную функцию, которая использует загадочную функцию "done".

passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function (err, user) {
      if (err) { return done(err); }
      if (!user) {
        return done(null, false, { message: 'Incorrect username.' });
      }
      if (!user.validPassword(password)) {
        return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
   }
));

Теперь, в экспресс-документации, существует немало методов, которые передают что-то, называемое далее.

app.use(function(err, req, res, next){
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

Разве это разница между двумя фреймами, экспрессом и паспортом? Или они делают две отдельные вещи?

Ответ 1

Разве это разница между двумя фреймами, экспрессом и паспортом?

Нет, они различны в той цели, для которой они используются. Express используется в качестве рамок приложения на node.js, где, поскольку паспорт просто обрабатывает часть аутентификации веб-приложения.

about next()

next() является частью соединения, которое inturn является выраженной зависимостью. Цель вызова next() - вызвать следующее промежуточное изделие в экспресс-стеке.

Чтобы лучше понять концепцию next(), вы можете посмотреть пример приложения, построенного на выразить здесь.

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

app.get('/account', ensureAuthenticated, function(req, res){

Здесь makeAuthenticated - это промежуточное программное обеспечение, которое определено внизу, например

function ensureAuthenticated(req, res, next) {
  if (req.isAuthenticated()) { return next(); }
  res.redirect('/login')
}

как вы можете видеть, аутентифицирован ли пользователь, функция вызывает next() и передает управление следующему уровню в обработчике маршрута, написанном выше, иначе он перенаправляет на другой маршрут даже без вызова next()

about done()

done(), с другой стороны, используется для запуска обработчиков возвращаемых URL-адресов, которые мы пишем для проверки подлинности паспорта. Чтобы узнать больше о том, как это работает, вы можете посмотреть образцы кода в паспорт здесь и посмотреть раздел под названием Пользовательский обратный вызов

app.get('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.logIn(user, function(err) {
      if (err) { return next(err); }
      return res.redirect('/users/' + user.username);
    });
  })(req, res, next);
});

Здесь второй параметр passport.authenticate - это определение done(), которое вы собираетесь вызывать из стратегии паспорта.

примечание

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

Ответ 2

pass done() хочет, чтобы вы передали ошибку (или null) для первого параметра и пользовательский объект в качестве второго параметра.

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

Ответ 3

Вернитесь назад, потому что я думаю, что у вас может быть некоторая путаница.

Экспресс - это веб-приложение. Он отвечает за направление пользователей на ресурсы в очень широком смысле.

Паспорт - это система проверки подлинности. Он отвечает за то, чтобы пользователям было разрешено обращаться к указанным ресурсам.

В обеих средах есть идея промежуточного программного обеспечения. Middleware - это в основном обобщенный поток управления. Например, в некоторых рамках Express вы можете сказать:
1.) Убедитесь, что параметр x действителен при запросе маршрута '/user/: x'
    if valid, then next() → , что означает переход к следующей функции промежуточного программного обеспечения()
2.) Убедитесь, что у пользователя есть сеанс и т.д.
3.) И когда все промежуточное ПО было выполнено, мы выполняем приложение
Например, фотографии router.get('/', function (req, res) {//когда запрашивается маршрут '/'
    res.render('index', {title: 'Express'});//отправляем index.html
});

В Passport они также используют идею промежуточного программного обеспечения, однако вместо next() они используют done() и это немного сложнее. См. Эту страницу для получения дополнительной информации
http://toon.io/understanding-passportjs-authentication-flow/