Node.js,Express和Jade – 表单

我正在使用Node.js,Express和Jade,我试图找出如何发布,validation和处理表单数据。

在我的翡翠文件中,我创build了一个联系表单:

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”来validation表单,如下所示:

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

所以有三种情况,我的页面被渲染,每一个都可以访问不同的局部variables:

  1. 第一次加载页面时(errors = undefined,success = undefined)
  2. 当表单被提交并且有错误时(errors = array,success = undefined)
  3. 当表单被提交并且没有错误时(错误= undefined,成功= true)

所以我的主要问题是:

  1. 当我的Jade页面被加载时,当我尝试访问一个不存在的variables时,它似乎会抛出一个错误。 例如,我想查看是否设置了variables“success”,如果是,我想隐藏表单并显示“谢谢”消息。 有没有一种简单的方法来处理Jade中的variables,将要么是未定义的或值?
  2. 当表单被提交并且有validation错误的时候,我想显示一个错误信息(这不是问题),但是也用以前提交的variables填充表单(例如,如果用户提供了一个名字,但没有提供邮件,错误应该引用空白的电子邮件,但表格应保留其姓名)。 此刻显示错误消息,但我的表单被重置。 有没有一种简单的方法来设置字段的input值为发布数据中的值?

  1. 你可以通过使用locals.variable而不是仅仅是variables来解决这个问题。 你也可以在jade中使用javascript。

    -locals.form_model = locals.form_data || {};

  2. 我用了两种方法来解决这个问题。 第一个是重新渲染视图,并将req.body作为本地传递。 我有一个约定,我的表单为他们的字段值使用form_model.value。 这种方法适用于简单的表单,但当表单依赖于数据时它会开始崩溃。

    第二种方法是将您的请求传递给会话,然后redirect到呈现表单的路由。 有这条路线寻找一个特定的会话variables,并在您的forms使用这些值。