ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript – node.js回调中’done’和’next’之间的区别

2019-10-03 22:37:07  阅读:614  来源: 互联网

标签:javascript node-js express passport-js


在护照[configure authentication]文档中,它有一个相当可怕的功能,使用神秘的功能“完成”.

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

现在,在express documentation中有很多方法可以传递下一个叫做next的东西.

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

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

解决方法:

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

不,它们的用途与它们的目的不同. Express用作node.js上的应用程序框架,其中passport只处理Web应用程序的身份验证部分.

关于next()

next()是connect的一部分,inturn是一个明确的依赖.调用next()的目的是触发express堆栈中的下一个中间件.

要以更简单的方式理解next()概念,您可以查看基于express here构建的示例应用程序.

正如您在指向的行中所看到的,应用程序使用路由级中间件来检查用户是否已登录.

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

这里确认是经过验证的中间件,它是在底部定义的

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

正如您可以看到用户是否经过身份验证,该函数调用next()并将控制权传递给上面编写的路由处理程序中的下一层,否则即使不调用next()也会重定向到另一个路径

关于完成()

另一方面,done()用于触发我们为护照身份验证编写的返回URL处理程序.要了解有关完成方式的更多信息,您可以查看passport here处的代码示例,并查看标题为“自定义回调”的部分

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

注意

在这里,我在上面提供的两个链接中的示例代码有助于理解其行为而不是文档.我建议你也这样做.

标签:javascript,node-js,express,passport-js
来源: https://codeday.me/bug/20191003/1851038.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有