如何使用express.js和node停止表单提交

时间:2012-09-22 05:18:57

标签: forms validation node.js express ejs

我使用快速验证器验证我的表单...如果我有错误,阻止表单提交并返回登录页面的最佳方法是什么。这就是我所拥有的,只是寻找处理这个问题的最佳方法(不确定return语句)。

//routes/index.js
exports.login.post = function(req, res){
  req.assert('username', 'Please enter username').notEmpty();
  req.assert('password', 'Please enter password').notEmpty();
  res.locals.errors = req.validationErrors(true);

  if ( res.locals.errors ) {
    console.log(res.locals.errors);
    var d = { title: 'Login' };
    res.render('login', { d: d });
    return;
  }

 //do login here if no errors
};

我也不知道如何在表单模板(ejs)中获取原始值。

我尝试传递req.param,但它是空的。

错误的对象只有那些有错误的字段,所以如果我输入用户名,但保留密码为空,我只在err对象中获取密码,而不是用户名...所以我需要req.param.username,但是当我通过{q:req.param}并使用<%= inspect(q)%>它是空的。

更新: req.body为我提供了预先填充表单的原始帖子参数。所以你需要错误的堆栈和req.body堆栈以获得良好的体验。

2 个答案:

答案 0 :(得分:2)

这就是我的工作

app.post('/form_process', validateForm, form.handle)
function validateForm(req, res, next) {
  req.assert('username', 'Invalid Username').notEmpty().isAlpha();
  req.assert('password', 'Invalid Password').notEmpty().isAlpha();

  var errors = req.validationErrors();
  if (errors) {
    //res.send(errors,500);
    var original_values = {
      username: req.param('username'),
      password: req.param('password')
    }
    res.render('login', { errorMsg: errors, original: original_values, title: "Login error" })
    return;
  }
  else next()
}

答案 1 :(得分:1)

我建议使用flashify之类的内容来设置Flash通知并将请求重定向回视图。

所以你可以这样做:

if ( res.locals.errors ) 
{
  res.flash('error','bad username/password');
  req.session.formData = req.body;
  res.redirect('back');
}

然后在视图中,您只需检查flash.error是否存在,如果有,则输出消息,然后:<%= flash.error %>:)