Passport.js 身份验证 - 向验证器注册

时间:2021-07-13 06:14:35

标签: javascript express passport.js

我正在尝试使用 Passport.js 中间件来注册和登录用户。我想使用带有 express-validator 的注册用户路由。我可以使用 mongoose 做到这一点,但是 sequelize(Postgres 方言)给了我错误。

这是我的“注册”策略:

passport.use(
  'register',
  new localStrategy(
    {
      usernameField: 'username',
      passwordField: 'password',
      passReqToCallback: true,
    },
    async (req, username, password, done) => {
      try {
        const user = await models.user.create(req.body);
        return done(null, user);
      } catch (error) {
        done(error);
      }
    }
  )
);

然后是 /register 路由本身(省略了大部分验证器):

router.post(
  '/register', [
    body('username').trim().isLength({ min: 1 }).withMessage('Username is required').escape(),
    async (req, res, next) => {
      const errors = validationResult(req);

      if (!errors.isEmpty()) {
        return res.json({ errors: errors.array() })
      } else {
        await passport.authenticate('register', { session: false })(req, res, next);
        return res.json({
          message: 'Signup successful',
          user: req.user.username
        });
      }
    } 
  ]
);

一些事情:

  1. 如果我只是在没有额外验证中间件的情况下调用passport.authenticate,它就可以正常工作。
router.post(
  '/register',
  passport.authenticate('register', { session: false }),
  async (req, res, next) => {
    res.json({
      message: 'Signup successful',
      user: req.user.username
    });
  }
);
  1. 但是,一旦我尝试使用验证器添加数组,就会收到 UnhandledPromiseRejectionWarning 错误 -
(node:3353) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'username' of undefined

并且服务器给出“无法POST /注册”错误。

如果我从返回的对象中删除 req.user.username 属性,它工作正常。即使有了它,记录确实是在数据库中创建的。但似乎 res.json 会在调用 Passport.authenticate 之前返回,即使它位于 async/await 块中。

对正在发生的事情的想法?

非常感谢!

0 个答案:

没有答案