当前位置: 首页 > 面试题库 >

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

柏修洁
2023-03-14
问题内容

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

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()更轻松地理解该概念,您可以在 此处查看 基于
express
构建的示例应用程序。

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

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中的“ process.stdout.write”和“ console.log”之间有什么区别? 编辑:使用console.log的变量显示了很多不可读的字符,而使用process.stdout.write的显示了一个对象。 这是为什么? 问题答案: 带有格式化输出的调用。有关实现,请参见console.js。 当前(v0.10.ish):

  • 问题内容: res.setHeader和res.header有什么区别。应该使用哪一个启用CORS?在某些页面中,使用res.header,而在某些页面中将res.setHeader用于CORS。 问题答案: 是Node.js的本机方法,也是Express框架中方法的别名。 文档:, 这两种方法做的完全一样,设置标头的HTTP响应。唯一的区别是只允许您 设置单个标头 ,并允许您 设置多个标头 。因

  • 我正在制作一个程序,并使用用户输入。当我得到一个字符串时,我总是使用. nextLine(),但我也使用了. Next(),它做同样的事情。有什么区别呢? 有什么区别?

  • 问题内容: res.location()方法的用途是什么?我可以使用res.redirect()重定向到特定的URL,如果在res.redirect()之前使用res.location(),则看不到任何更改。 问题答案: 它们的描述非常相似,但功能更多。看到差异的最简单方法是查看源代码。 只需设置响应头即可。它不会设置响应状态代码或关闭响应,因此您可以根据需要编写响应正文,然后必须自己调用。 另一

  • 问题内容: 以下调用之间有区别吗? 与 应该首选哪一个? 问题答案: 这两个函数以截然不同的方式处理段。只会将它与前一个参数连接起来,但是会将其视为根目录,并忽略所有先前的路径- 将其视为与每个参数一起执行的结果: 要注意的另一件事是,它将始终产生绝对URL,并且将使用您的工作目录作为解析此路径的基础。但是,无论如何,这都是一条绝对路径,这对您而言并不重要。 对于您应该使用哪一个,答案是:这取决于

  • 本文向大家介绍测试和调试之间的区别,包括了测试和调试之间的区别的使用技巧和注意事项,需要的朋友参考一下 在以任何编程语言开发的任何软件或应用程序的开发过程中以及开发之后,测试和调试都是最重要的步骤或实践。现在,根据功能和实践方法,我们可以区分测试和调试。 以下是测试和调试之间的重要区别。 序号 键 测验 调试 1 定义 从技术上来说,测试是检查应用程序是否与预期功能相同的过程,而不是应有的功能。