Validation Node.js、Express和Jade-表单

Validation Node.js、Express和Jade-表单,validation,node.js,express,pug,Validation,Node.js,Express,Pug,我正在使用Node.js、Express和Jade,并试图找出如何发布、验证和处理表单数据 在我的jade文件中,我创建了一个联系人表单: div#contact-area form(method='post',action='') label(for='name') Name: input(type='text',name='name',id='name') label(for='email') Email:

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

在我的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
        });
    }
 });
因此,有三种场景呈现我的页面,每种场景都可以访问不同的局部变量:

  • 首次加载页面时(错误=未定义,成功=未定义)
  • 提交表单时出现错误(错误=数组,成功=未定义)
  • 提交表单且没有错误时(错误=未定义,成功=真)
  • 所以我的主要问题是:

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

    -locals.form|u model=locals.form|u data |{}

  • 我用了两种方法来解决这个问题。第一种方法是重新渲染视图,并将req.body作为本地对象传递。我有一个惯例,我的表单使用form_model.value作为字段值。这种方法对于简单的表单非常有效,但当表单依赖于数据时,它会开始出现一些故障

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


  • 在jade文件中添加错误消息,然后运行代码。
    只需使用以下代码更新您的jade代码:

    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
    

    嗨,谢谢你的回复。但是,您的代码
    -var form_model={}| | locals.form_data
    始终设置
    form_model={}
    ,因为
    {}
    是一个对象(未定义),因此
    局部变量。form_数据将永远不会被评估?如果我将代码更改为-
    var form_model=locals.form_data | |{}
    我仍然会得到一个错误,因为编译器说
    form_data
    不存在。我不明白这一点,因为这应该适用于普通Javascript。关于第2点,我已经实现了您将数据传递回视图的想法,在我的例子中,我传递
    req.form
    woops,您是对的,form_模型总是{}在我的代码中。我会更新的。我还注意到它实际上应该是本地人。