2012-08-10 206 views
5

我正在使用Node.js,Express和Jade,我试图弄清楚如何发布,验证&流程表单数据。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 

然后我利用模块“表达验证器”验证形式如下:

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

因此,有三个场景,其中我的页面呈现,并且每个人都可以访问不同的局部变量:

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

所以我的主要问题是:

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

回答

1
  1. 您可以修复使用locals.variable而不只是变量。你也可以在jade中使用javascript。

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

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

    第二种方法是将您的req.body传递给会话,然后重定向到呈现表单的路由。找到一个特定的会话变量并在表单中使用这些值。

+0

嗨,感谢您的回复。但是,你的代码不会'-var form_model = {} || locals.form_data;'始终设置'form_model = {}',因为'{}'是一个对象(不是未定义的),因此'locals.form_data'永远不会被评估?如果我将代码更改为-'var form_model = locals.form_data || {}'我仍然遇到错误,因为编译器说'form_data'不存在。我不明白这一点,因为这应该与普通的Javascript一起工作。关于第2点,我已经实现了将数据传递回视图的想法,在我的情况下,我传递了'req。表单' – 2012-08-13 01:13:31

+0

woops,你是对的form_model总是{}在我的代码中。我会更新它。我也只是注意到它实际上应该是locals.form_model。 – Pickels 2012-08-13 11:18:08