2013-09-25 34 views
1

我正在使用Node/Express和Jade构建应用程序。JadeJS和重写呈现视图中的预写入表单值

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

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

我试图提交req.body(消毒)数据到重新呈现的页面,它的工作原理。 但是如果试图在我的Jade视图中使用这些数据,当这个请求数据是而不是定义时,节点将会输出并出错......就像你第一次进入这个页面并且没有输入任何错误输入尚未。

我该如何解决这个问题?

回答

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'); 
    }; 
    }); 
}); 

在你的玉模板,处理这两种情况:

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') 
+0

谢谢!我不习惯与会话一起工作。我是否正确地认为:'app.use(express.cookieParser());'和这个'app.use(express.session();'是我需要能够将值存储在req.session中的所有东西? –

+0

一个简短的问题,你可以将reales.value中的值保存到res.locals中,因为req.session在那里不可用,所以你可以这样做,因为这里的值不可用? 将变量传递给?鉴于这样这是错的 'res.render( '形式',{ savedValues:req.session.savedValues ||空, savedErr:req.session.savedErr ||空, ... }? );' –

+0

如果你确实不需要会话,你当然可以重新呈现表单中的表单 – Plato