Express.js表单处理和错误检查 - 正确的方法

5 forms node.js express

我在模板中有一个表单,我根据GET请求呈现:

app.get('/register', function (req, res) {
  res.render('register', {
      title: 'Register'
    , twitterDetails: req.session.twitterDetails
    }
  );
});
Run Code Online (Sandbox Code Playgroud)

然后我在POST请求中处理表单:

app.post('/register', function (req, res, next) {
  // Generic validation
  req.assert('name', 'Name is empty').notEmpty();
  req.assert('username', 'Username is empty').notEmpty();
  // Email validation
  req.assert('email', 'Email is invalid.').isEmail();
  req.assert('email', 'Email field is empty').notEmpty();
  // Password validation
  req.assert('password', 'Password too short. Must be 6 characters or more.').len(6);
  req.assert('password', 'Passwords do not match.').is(req.body.confirmPassword);
  req.assert('password', 'Password field is empty').notEmpty();
  req.assert('confirmPassword', 'Confirm password field is empty').notEmpty();
  var errors = req.validationErrors(true);
  if (errors) {
    console.log(errors);
    // What do to if there are errors?
  }
  // If there are no errors, continue handling the form…
});
Run Code Online (Sandbox Code Playgroud)

在这个表单处理程序中,我正在检查express-validator模块的错误.这很好,但我的问题是如果有错误该怎么办.AFAIK有两种选择:

  1. 将用户重定向到/register,req.flash用于将错误传递给下一个请求
  2. 重新渲染模板并将错误直接传递给模板

使用第一个选项,我冒着丢失表单数据的风险,让用户远离POST.我可以使用他们填写的数据来抢占表单req.flash,但是当页面刷新时这将消失.

使用第二个选项,我正在重复自己 - 特别是如果我向模板发送了大量变量,这些变量都必须重复.我还需要通过模板传递所有表单数据并使用这些值填写表单.

处理这样的表格的正确程序是什么?

Flo*_*ine 8

使用选项1.这称为POST/Redirect/GET模式,随处可用.

如果您害怕丢失数据,请使用会话.这就是他们的目的.在会话期间保持状态.

不要忘记HTTP是无状态的.