1

当验证失败时,我在登录表单中我能够显示验证错误消息,但我不知道如何重新填充登录表单。

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

到目前为止我所做的事情是我正在尝试获取电子邮件价值,因为我正在使用 connect-flash 从 passport.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(); 它显示空数组,电子邮件和密码未保存在闪存中,因此我无法在视图中填充输入字段

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

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

4

2 回答 2

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。

于 2019-07-16T12:47:28.340 回答
0

将 req.body 分配给 flash,然后像这样发送回验证错误重定向

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")
    });
};
于 2019-08-02T11:19:21.290 回答