我正在使用Node.js,Express和Jade,并且试图弄清楚如何发布,验证和处理表单数据。
在我的玉文件中,我创建了联系表:
div#contact-area
form(method='post',action='')
label(for='name') Name:
input(type='text',name='name',id='name')
label(for='email') Email:
input(type='text',name='email',id='email')
input(type='submit',name='submit',value='Submit').submit-button
然后,我利用模块'express-validator'验证表单,如下所示:
var express = require('express')
,routes = require('./routes')
,http = require('http')
,path = require('path')
,expressValidator = require('express-validator')
;
var app = express.createServer();
app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'jade'); //not needed if we provide explicit file extension on template references e.g. res.render('index.jade');
app.use(express.bodyParser());
app.use(expressValidator);
app.use(express.methodOverride());
app.use(app.router);
});
//display the page for the first time
app.get('/mypage', function(req,res){
res.render('mypage', {
title: 'My Page'
});
});
//handle form submission
app.post('/mypage', function(req,res){
req.assert('name', 'Please enter a name').notEmpty();
req.assert('email', 'Please enter a valid email').len(6,64).isEmail();
var errors = req.validationErrors();
if( !errors){
sendEmail(function(){
res.render('mypage', {
title: 'My Page',
success: true
});
});
}
else {
res.render('mypage', {
title: 'My Page',
errors: errors
});
}
});
因此,在三种情况下呈现我的页面,每个场景都可以访问不同的局部变量:
所以我的主要问题是:
您可以通过使用locals.variable而不是variables来解决此问题。您也可以在翡翠中使用JavaScript。
-locals.form_model = locals.form_data || {};
我使用两种方法来解决此问题。第一个是重新渲染视图,然后将req.body作为本地传递。我有一个约定,我的表单将form_model.value用作其字段值。此方法适用于简单表单,但是当表单依赖数据时,它会开始崩溃。
第二种方法是将您的req.body传递给会话,然后重定向到呈现表单的路由。让该路由查找某个会话变量,然后在表单中使用这些值。
在您的玉文件中添加错误消息,然后运行您的代码。只需使用以下代码更新您的玉器代码:
div#contact-area
ul.errors
if errors
each error, i in errors
li.alert.alert-danger #{error.msg}
form(method='post',action='')
label(for='name') Name:
input(type='text',name='name',id='name')
label(for='email') Email:
input(type='text',name='email',id='email')
input(type='submit',name='submit',value='Submit').submit-button