JadeJS和重写视图的预写表单值

时间:2013-09-25 13:34:31

标签: node.js express pug

我正在使用Node / Express和Jade来构建和App。

我有一个POST路由,它清理并验证表单输入,然后将其保存到MongoDB。 如果此表单输入未经过验证,则路由将抛出错误,错误处理程序将重新呈现此页面...

这就是问题所在。在这个重新渲染中,希望表单值预先写好并准备好由用户纠正...我不想要一个干净的表单,用户必须重写所有内容。

我尝试将req.body(已清理的)数据提交给重新呈现的页面,该页面有效。 但是如果尝试在我的Jade视图中使用这些数据,当此req.body数据定义时,Node将输出并出错...就像您第一次进入此页面时一样,并且' nt输入了任何错误的输入。

我如何以一种好的方式解决这个问题?

1 个答案:

答案 0 :(得分:1)

编辑 - 如果没有代码示例,我不确定我的示例是否比您需要的更多或更少。

如果您在表单的POST请求处理程序中立即呈现表单模板,则可能不需要涉及req.session。只需保存适当的本地人并渲染您的模板即可。

如果您必须重定向或需要在多个请求中提供值,则可以将其保存在req.session中,如下所示。

无论哪种方式,请确保您的Jade模板处理所有情况;在我的示例中,我测试if(locals.savedValues)以决定是否将默认值或保存的值写入表单。

最后如果错误与玉不相关,请粘贴该错误。


使用req.session保存值。设置locals变量以表示已保存的值,或在呈现表单之前为null。

app.get('/form', function(req, res){
  res.locals.savedValues = req.session.savedValues || null;
  res.locals.savedErr = req.session.savedErr || null;
  res.render('form');
});

app.post('/form', function(req, res){
  var values = {
    name: req.body.name,
    email: req.body.email,
  };
  validateForm(values, function(err, processed){
    if(err){
      req.session.savedValues = processed; 
      req.session.savedErr = err;
      // req.session.savedValues = values, if you dont want to propose changes
      res.redirect('back');
    } else {
      delete req.session.savedValues;
      delete req.session.savedErr;
      res.redirect('/success');
    };
  });
});

在您的jade模板中,处理两种情况:

if(locals.savedErr)
  span.error=locals.savedErr
form(action='form', method='post')
  if(locals.savedValues)
    input#name(type='text')=locals.savedValues.name
    input#email(type='text')=locals.savedValues.email
  else
    input#name(type='text')
    input#email(type='text')