2012-08-10 101 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

相關問題