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

Express Passport(node.js)错误处理

慎风畔
2023-03-14
问题内容

我研究了如何通过此堆栈交换在节点中进行错误处理,但是我不确定身份验证失败时护照在做什么。我有以下LocalStrategy:

passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' },
  function(email, password, next) {

    User.find({email: UemOrUnm}, function(err, user){
      if (err) { console.log('Error > some err'); return next(err); }
      if (!user) { console.log('Error > no user'); return next('Incorrect login or password'); }

      if (password != user.password) {
        return next(Incorrect login or password);
      }
      return next(null, user);
    });
  }
));

在看到“错误>某些错误”控制台打印输出后,什么都没有发生。我认为它应该在带有错误参数的下一条路径上继续,但似乎没有这样做。这是怎么回事?


问题答案:

策略实施与passport.authenticate验证请求和处理成功/失败一起使用。

假设您正在使用此路由(向其传递了电子邮件地址和密码):

app.post('/login', passport.authenticate('local', {
  successRedirect: '/loggedin',
  failureRedirect: '/login', // see text
  failureFlash: true // optional, see text as well
});

这将调用该策略中的代码,其中可能发生以下三种情况之一:

  1. 尝试获取用户信息时发生内部错误(例如数据库连接已断开);这个错误将转嫁:next(err); 这将由Express处理并生成HTTP 500响应;
  2. 提供的凭据无效(没有用户使用提供的电子邮件地址,或者密码不匹配);在这种情况下,你不产生一个错误,但你传递一个false为用户对象:next(null, false); 这将触发failureRedirect(如果您未定义,则会生成HTTP 401未经授权的响应);
  3. 一切检查出来,你有一个有效的用户对象,所以你把它传递:next(null, user); 这将触发successRedirect;

如果验证无效(但不是内部错误),则可以在回调中传递额外的消息:

next(null, false, { message : 'invalid e-mail address or password' });

如果您已经使用failureFlash 安装了connect-
flash中间件
,则所提供的消息将存储在会话中,并且可以方便地访问,例如在模板中使用。

编辑: 也可以自己完全处理身份验证过程的结果(而不是Passport发送重定向或401):

app.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) {
      return next(err); // will generate a 500 error
    }
    // Generate a JSON response reflecting authentication status
    if (! user) {
      return res.send({ success : false, message : 'authentication failed' });
    }
    // ***********************************************************************
    // "Note that when using a custom callback, it becomes the application's
    // responsibility to establish a session (by calling req.login()) and send
    // a response."
    // Source: http://passportjs.org/docs
    // ***********************************************************************
    req.login(user, loginErr => {
      if (loginErr) {
        return next(loginErr);
      }
      return res.send({ success : true, message : 'authentication succeeded' });
    });      
  })(req, res, next);
});


 类似资料:
  • 问题内容: 我已经阅读了一些在node.js中使用mysql的示例,并且对错误处理有疑问。 大多数示例都进行如下错误处理(为简便起见): 每次发生sql错误时,这都会导致服务器崩溃。我想避免这种情况并保持服务器运行。 我的代码是这样的: 我不确定这是否是处理它的最佳方法。我也想知道查询的块中是否应该有一个。否则,连接可能会保持打开状态并随着时间的推移逐渐建立。 我习惯了Java 或在这里可以“干净

  • 问题内容: 当我的discord bot上网时间过长(大约3-4小时)时,会随机出现此错误,但有时该错误发生得更早,有时又更晚。真的很困扰我 问题答案: 我在自己的代码中为这个问题努力了一段时间。主要问题是跟踪是完全无用的, 并且 错误很少发生,以至于使“在终端中运行并等待”是徒劳的任务。最终,我能够弄清楚Discord.js客户端本身正在引发错误- 在我阅读的任何文档中都没有提到此错误,因此我没

  • 问题内容: 我对Node.js并不陌生,尽管我通常对JavaScript非常熟悉。我的问题是关于如何处理node.js中的错误的“最佳实践”。 通常,在对Web服务器,FastCGI服务器或各种语言的网页进行编程时,我在多线程环境中使用带有阻止处理程序的Exceptions。当有请求进入时,我通常会执行以下操作: 这样,我始终可以处理内部错误并向用户发送有效响应。 我知道使用node.js可以执行

  • 在微软的botframework上玩,当我尝试运行app.js文件,这是bot的主文件,第一次很好,当我关闭bot模拟器和所有程序,再次运行app.js后,弹出这个错误消息

  • 问题内容: 与其他框架相比,Node.js + Express.js应用程序中的错误报告/处理似乎有所不同。我理解它的工作原理是否正确? A) 通过接收错误作为回调函数的参数来 检测 错误。例如: B) 通过调用next(err) 报告 MIDDLEWARE中的​​错误。例: C) 通过抛出错误来 报告 路由中的错误。例: d) 手柄 通过配置通过app.error自己的错误处理的错误()或使用通

  • 通过对错误类型实现 Display 和 From,我们能够利用上绝大部分标准库错误处理工具。然而,我们遗漏了一个功能:轻松 Box 我们错误类型的能力。 标准库会自动通过 Form 将任意实现了 Error trait 的类型转换成 trait 对象 Box<Error> 的类型(原文:The std library automatically converts any type that imp