【问题标题】:passportjs configuration `Done` callbackpassportjs 配置 `Done` 回调
【发布时间】:2020-12-17 14:38:51
【问题描述】:

我一直在研究Passport configure documention-

var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;

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

根据文档,如果凭据有效,则验证回调 function(username, password, done){...} 调用 done 以向经过身份验证的用户提供 Passport。由于done 也是回调函数,我希望它的函数体作为验证回调的参数传入。在Express 4.x Passport example 中,代码类似,只是done 被称为cb。能够更改其名称有什么好处?在这两种情况下,我都找不到回调的主体,所以我认为它是 Passport 的一部分 - 这是正确的吗?该文档提供了如何调用Done 的示例,但我找不到它的API 调用签名。在第一个示例中,返回调用 Done 的结果(例如 return done(null, user);)但我们如何知道 Done 实际返回什么?

【问题讨论】:

    标签: node.js express callback passport.js


    【解决方案1】:

    能够更改名称有什么好处?

    您可以随意命名函数参数。这就是函数的工作原理。

    Express 无法阻止您将函数编写为 function(alice, bob, charline),尽管这可能很荒谬。

    在这两种情况下,我都找不到回调的主体,所以我认为它是 Passport 的一部分 - 这是正确的吗?文档给出了如何调用 Done 的示例,但我找不到它的 API 调用签名。

    它在“验证回调”下的Strategy section 中。

    在第一个示例中,返回了调用 Done 的结果(例如 return done(null, user);)但是我们如何知道 Done 实际返回了什么?

    您可以记录它并查看,但文档没有提及它返回的内容,只提及它接受的参数。使用return 语句最有可能退出函数,因此不会执行进一步处理。

    【讨论】:

    • 感谢您的回答。 done 函数是否在 Passport 中实现?如果是这样,为什么要在验证回调的第三个参数中传递done回调函数?
    • "感谢您的回答。passport 中是否实现了 done 功能?" — 是的
    • "如果是这样,为什么要在验证回调的第三个参数中传递完成回调函数?" ——你没有。它被 传递给 该函数的第三个参数,并且必须如此,否则您将无法调用它。
    • 如果done是Passport提供的,为什么不能像其他库函数一样直接调用呢?
    • 出于同样的原因,您不能通过直接访问res来调用res.send()。它是为上下文生成的。
    【解决方案2】:

    调用什么回调没有区别。就像 Express.js 中的 (req, res, next),你可以调用它:(request, response, nextFunc),但它不会改变函数的工作

    【讨论】:

    • 你的意思是donecb 是同一个formal parameter 的两个名字吗?如果有,对应的实参是如何提供的?
    • @user2309803 你可以随意调用它们,它只是一个带3个参数的函数,它不关心它们叫什么
    • 开发者好像没有传入done的实现,那么验证回调的第三个参数有什么用呢?
    • @user2309803 done 仅表示进程已结束或因错误而被调用。它是一种维护构建 Express 的中间件的对象。所有的 passport.js 都建立在 Express 及其使用中间件的方法之上。 passoprt.js 内部的 done 类似于 next from (req, req, next)。不要在这里寻找任何隐藏的含义,它只是中间件(expressjs.com/en/guide/using-middleware.html
    猜你喜欢
    • 1970-01-01
    • 2014-09-30
    • 2014-06-24
    • 1970-01-01
    • 2023-03-19
    • 2017-02-04
    • 1970-01-01
    • 2017-08-21
    • 2015-07-15
    相关资源
    最近更新 更多