node.js回调中“ done”和“ next”之间的区别

在护照[配置身份验证]文档中,它具有看上去很吓人的功能,该功能使用了神秘功能“完成”。

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);

});

}

));

现在,在快速文档中,有许多方法可以传递称为next的方法。

app.use(function(err, req, res, next){

console.error(err.stack);

res.status(500).send('Something broke!');

});

这是快递和护照这两个框架之间的区别吗?还是他们在做两件事?

回答:

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

不,它们的用途不同。Express用作node.js上的应用程序框架,其中护照仅处理Web应用程序的身份验证部分。

关于next()

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

为了next()更轻松地理解该概念,您可以在 基于

构建的示例应用程序。

如您所指出的那样,该应用程序使用路由级中间件来检查用户是否已登录。

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

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

function ensureAuthenticated(req, res, next) {

if (req.isAuthenticated()) { return next(); }

res.redirect('/login')

}

如您所见,如果用户通过了身份验证,则该函数会调用next()并将控制权传递给上面编写的路由处理程序中的下一层,否则它将重定向到另一条路由,即使不调用next()

关于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.authenticatedone()您将要通过护照策略调用的定义。

注意

在这里,通过上面我提供的两个链接中的示例代码,比文档更有助于理解其行为。我建议您也这样做。

以上是 node.js回调中“ done”和“ next”之间的区别 的全部内容, 来源链接: utcz.com/qa/415893.html

回到顶部