我正在使用Node / Express和Jade来构建和App。
我有一个POST路由,它清理并验证表单输入,然后将其保存到MongoDB。 如果此表单输入未经过验证,则路由将抛出错误,错误处理程序将重新呈现此页面...
这就是问题所在。在这个重新渲染中,希望表单值预先写好并准备好由用户纠正...我不想要一个干净的表单,用户必须重写所有内容。
我尝试将req.body(已清理的)数据提交给重新呈现的页面,该页面有效。 但是如果尝试在我的Jade视图中使用这些数据,当此req.body数据未定义时,Node将输出并出错...就像您第一次进入此页面时一样,并且' nt输入了任何错误的输入。
我如何以一种好的方式解决这个问题?
答案 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')