node.jscallback中的“完成”和“下一个”之间的区别

在护照[configuration身份validation]文档中,它有一个相当吓人的function,使用神秘function“完成”。

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!'); }); 

这是两个框架,expression和护照之间的区别吗? 还是他们在做两件独立的事情?

这是两个框架,expression和护照之间的区别吗?

不,它们的用途是不同的。 Express被用作node.js上的应用程序框架,其中护照只处理Web应用程序的authentication部分。

关于next()

next()是连接的一部分,inturn是一个明确的依赖关系。 调用next()的目的是在快速堆栈中触发下一个中间件。

要以更简单的方式理解next()概念,您可以在这里查看构build在express上的示例应用程序。

正如你所看到的那样,应用程序使用路由级中间件来检查用户是否login。

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

这里ensureAuthenticated是在底部定义的中间件

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

就像你可以看到用户是否被authentication一样,这个函数调用next()并将控制权交给上面编写的路由处理程序中的下一层,否则即使没有调用next() ,它也会redirect到另一个路由。

关于完成()

另一方面,done()用于触发我们为通行证身份validation编写的返回url处理程序。 要了解更多有关如何完成工作,你可以看看这里的护照代码示例,并检查标题为自定义callback的部分

 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()的定义。

注意

这里通过我在上面提供的两个链接中的示例代码已经帮助了解其行为比文档更多。 我build议你也这样做。

护照的done()要求你传递一个错误(或null)作为第二个参数,第一个参数和一个用户对象。

express的next()需要在第一个参数中有错误,或者在没有错误的情况下根本没有参数被调用。 你也可以传递一个路由的名字来将控制redirect到第一个参数中,但这不是很常见

让我们回来,因为我认为你可能会有一些困惑。

Express是一个Web应用程序框架。 它在很大程度上负责指导用户使用资源。

Passport是一个authentication框架。 它负责确保用户被允许访问所述资源。

在这两个框架中都有一个中间件的概念。 中间件基本上是泛化的控制stream。 例如,在某些Express框架中,您可以说:
1.)请求路由'/ user /:x'时确保参数x有效
如果有效,则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/