验证失败时如何重新填充我的登录表单

时间:2019-07-16 12:25:15

标签: node.js express express-validator connect-flash

当验证失败时,我以登录表单显示我可以显示验证错误消息,但我没有获得如何重新填充登录表单的信息。

我希望用户在验证错误时不要再次输入其电子邮件地址。

到目前为止,我已经做了什么,以至于我试图使用connect-flash从password.js发回错误时,试图获取电子邮件的价值。

我的护照当地策略是

passport.use(
  "local.signin",
  new LocalStrategy(
    {
      usernameField: "email",
      passwordField: "password",
      passReqToCallback: true
    },
    function(req, email, password, done) {
      console.log("I am in passport");
      req.checkBody("email", "invalid email")
      .notEmpty()
      .isEmail();
      req.checkBody("password",'invalid password')
      .notEmpty();
      req.flash('email',email);
      req.flash('password',password);
      var errors = req.validationErrors();

        if(errors){
          var messages = [];
          errors.forEach((error) => {
              messages.push(error.msg);
          });
        console.log("errors: ", errors);
          return done(null, false, req.flash("error", messages));
        }
        User.findOne({email:email}, (err, user) => {
          if(err){
            return done(err);
          }
          if(!user){
            return done(null, false, {message: "No user found!"});
          }
          if(!user.validPassword(password)){
            return done(null, false, {message: "Wrong Password"});
          }
          return done(null, user);
        });
    }
  )
);

以及验证失败后路由重定向到的索引函数

exports.index = function(req, res) {
        var messages = req.flash("error");
        console.log("email: ",req.flash('email'));
    res.render("admin/index", {
      layout: "loginSignup",
      messages: messages,
      hasErrors: messages.length > 0,
      email: req.flash('email'),
      password: req.flash('password')
    });
};

当我console.log();它显示为空数组,电子邮件和密码未保存在Flash中,因此我无法在视图中填充输入字段

我没有得到我的代码有什么问题,当我能收到错误消息时,为什么不输入电子邮件和密码值呢?

还是有更好的方法在Node.js中重新填充表单

2 个答案:

答案 0 :(得分:1)

将请求主体指定为闪烁,然后像这样发送验证错误重定向

passport.use(
  "local.signin",
  new LocalStrategy(
    {
      usernameField: "email",
      passwordField: "password",
      passReqToCallback: true
    },
    function(req, email, password, done) {
      req.checkBody("email", "invalid email")
      .notEmpty()
      .isEmail();
      req.checkBody("password",'invalid password')
      .notEmpty();
      var form =  req.flash("form",req.body);
      var errors = req.validationErrors();

        if(errors){
          var messages = [];
          errors.forEach((error) => {
              messages.push(error.msg);
          });
        console.log("errors: ", errors);
          return done(null, false, {
              error: req.flash("error", messages),
              form: form
               });
        }
        User.findOne({email:email}, (err, user) => {
          if(err){
            return done(err);
          }
          if(!user){
            return done(null, false, {message: "No user found!", form: form});
          }
          if(!user.validPassword(password)){
            return done(null, false, {message: "Wrong Password", form: form});
          }
          return done(null, user);
        });
    }
  )
);

和重定向路线上的从表单变量获取req.body,并以以下代码的形式发送到您的视图

exports.index = function(req, res) {
        var messages = req.flash("error");
    res.render("admin/index", {
      layout: "loginSignup",
      messages: messages,
      hasErrors: messages.length > 0,
      form : req.flash("form")
    });
};

答案 1 :(得分:0)

为什么不尝试这样的事情?

res.render("admin/index", {
  layout: "loginSignup",
  messages: messages,
  hasErrors: messages.length > 0,
  email: req.body('email') || '',
  password: req.body('password') || ''
});

注意,这是假设路由已安装在app.post()调用上,并且您使用的是bodyparser中间件,如果使用的是app.get(),则在我的示例中将req.body更改为req.params