【问题标题】:Node.js, Express and Jade - FormsNode.js、Express 和 Jade - 表单
【发布时间】:2012-08-07 09:15:07
【问题描述】:

我正在使用 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
        });
    }
 });

所以我的页面呈现三种场景,每一种都可以访问不同的局部变量:

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

所以我的主要问题是:

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

【问题讨论】:

    标签: validation node.js express pug


    【解决方案1】:
    1. 您可以通过使用 locals.variable 而不仅仅是变量来解决这个问题。你也可以在jade中使用javascript。

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

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

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

    【讨论】:

    • 您好,感谢您的回复。但是,您的代码-var form_model = {} || locals.form_data; 不会总是设置form_model = {},因为{} 是一个对象(不是未定义的),因此locals.form_data 永远不会被评估?如果我将代码更改为 -var form_model = locals.form_data || {} 我仍然会收到一个错误,因为编译器说form_data 不存在。我不明白这一点,因为这应该适用于普通的 Javascript。关于第 2 点,我已经实现了您将数据传递回视图的想法,在我的情况下,我通过 req.form
    • 哎呀,你是对的 form_model 在我的代码中始终是 {}。我会更新它。我也刚刚注意到它实际上应该是 locals.form_model。
    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2014-10-24
      • 2013-03-17
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多