Как добавить экспресс валидатор 6.0.1 в свойства перенаправления passport.js - PullRequest
0 голосов
/ 23 июня 2019

В моем коде есть свойства successRedirect и failureRedirect passport.js, и я бы хотел, чтобы они запустили один раз express-validator 6.0.1 check() поля email и пароля.

Моя страница регистрации:

<form action="/user/signup" method="post">
        <div class="form-group">
            <label for="email">E-mail</label>
            <input type="text" id="email" name="email" class="form-control">
        </div>
        <div class="form-group">
            <label for="password">Password</label>
            <input type="text" id="password" name="password" class="form-control">
        </div>
    <input type="hidden" name="_csrf" value="{{ csrfToken }}">
<button type="submit">Sign Up</button>

Мой роутер:

const { check, validationResult } = require('express-validator');
   router.post("/user/signup", passport.authenticate("local.signup",
[
  check('email').isEmail(),
  check('password').isLength({ min: 5 })
],
(req, res) => {
  const errors = validationResult(req);

  if (!errors.isEmpty()) {
    return res.status(422).json({ errors: errors.array() });
  }
},
{
  successRedirect: "/user/profile",
  failureRedirect: "/user/signup",
  failureFlash: true
}));

passport.serializeUser((user, done) => {
    done(null, user.id);
});

passport.deserializeUser((id, done) => {
    User.findById(id, function(err, user) {
        done(err, user);
    });
});

Мой паспорт.js:

var passport = require("passport");
var User = require("../models/user");
var LocalStrategy = require("passport-local").Strategy;

passport.use("local.signup", new LocalStrategy({
    usernameField: "email",
    passwordField: "password",
    passReqToCallback: true
}, (req, email, password, done) => {
    User.findOne({"email": email}, (err, user) => {
        if(err) {
            return done(err);
        }
        if (user) {
            return done(null, false, {message: "Email is already in use."});
        }
        var newUser = new User();
        newUser.email = email;
        newUser.password = newUser.encryptPassword(password);
        newUser.save((err, result) => {
            if (err) {
                return done(err);
            }
            return done(null, newUser);
        });
    });
}));

Я новичок в экспресс-валидаторе, и я попробовал его в своем роутере. Но когда я запустил свой app.js и нажал кнопку регистрации, я получил TypeError: Cannot read property 'Symbol(express-validator#contexts)' of null. в терминале. Что я делаю не так и как я могу добавить express-validator 6.0.1 в мой код? Спасибо за ваше время.

1 Ответ

0 голосов
/ 23 июня 2019

Попробуйте переместиться passport.authenticate рядом с правилами валидации.

const { check, validationResult } = require('express-validator');

router.post("/user/signup",
    [
        check('email').isEmail(),
        check('password').isLength({ min: 5 })
    ],
    (req, res) => {
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
            return res.status(422).json({ errors: errors.array() });
        }
    },
    passport.authenticate("local.signup", {
        successRedirect: "/user/profile",
        failureRedirect: "/user/signup",
        failureFlash: true
    })
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...