2012-08-10 38 views
5

Tôi đang sử dụng Node.js, Express và Jade và tôi đang cố gắng tìm hiểu cách đăng, xác thực dữ liệu biểu mẫu quy trình &.Node.js, Express và Jade - Biểu mẫu

Trong file ngọc của tôi, tôi tạo ra một hình thức liên lạc:

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 

tôi sau đó sử dụng các mô-đun 'bày tỏ-validator' để xác nhận các hình thức như sau:

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

Vì vậy, có ba tình huống trong đó các trang của tôi được hiển thị và mỗi trang có quyền truy cập vào các biến cục bộ khác nhau:

  1. Khi trang được tải cho lần đầu tiên (lỗi = undefined, success = undefined)
  2. Khi biểu mẫu được gửi và có lỗi (lỗi = mảng, thành công = không xác định)
  3. Khi biểu mẫu được gửi và không có lỗi (lỗi = không xác định , thành công = true)

Vì vậy, vấn đề chính của tôi là rằng:

  1. khi trang Jade tôi được nạp, có vẻ như để ném một lỗi khi tôi cố gắng để truy cập vào một biến mà không tồn tại. Ví dụ, tôi muốn xem nếu biến 'thành công' được thiết lập, và nếu nó là tôi muốn ẩn các hình thức và hiển thị một "cảm ơn" tin nhắn. Có một cách dễ dàng để xử lý một biến trong Jade mà sẽ hoặc là không xác định hoặc một giá trị?
  2. Khi biểu mẫu đã được gửi và có lỗi xác thực, tôi muốn hiển thị thông báo lỗi (đây không phải là vấn đề) mà còn điền biểu mẫu với các biến được gửi trước đó (ví dụ: nếu người dùng đã cung cấp tên nhưng không có email, lỗi nên tham chiếu đến email trống nhưng biểu mẫu phải giữ lại tên của họ). Tại thời điểm thông báo lỗi được hiển thị nhưng biểu mẫu của tôi được đặt lại. Có cách nào dễ dàng để đặt giá trị đầu vào của các trường thành các giá trị trong dữ liệu bài đăng không?

Trả lời

1
  1. Bạn có thể khắc phục điều đó bằng cách sử dụng locals.variable thay vì chỉ biến. Ngoài ra, bạn có thể sử dụng javascript trong ngọc bích.

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

  2. Tôi đã sử dụng hai cách để giải quyết vấn đề này. Đầu tiên là tái render view và bạn chuyển req.body thành local. Tôi có một quy ước rằng các biểu mẫu của tôi sử dụng form_model.value cho các giá trị trường của chúng. Phương pháp này hoạt động tốt cho các biểu mẫu đơn giản nhưng nó bắt đầu phân tích một chút khi bạn tạo biểu mẫu dựa trên dữ liệu.

    Phương pháp thứ hai là chuyển req.body của bạn sang phiên rồi chuyển hướng đến tuyến đường biểu thị biểu mẫu. Có tuyến đường đó tìm kiếm một biến phiên nhất định và sử dụng các giá trị đó trong biểu mẫu của bạn.

+0

Xin cảm ơn phản hồi. Tuy nhiên, không phải mã của bạn '-var form_model = {} || 'luôn luôn đặt' form_model = {} ', như' {} 'là một đối tượng (không phải không xác định) và do đó' locals.form_data' sẽ không bao giờ được đánh giá? Nếu tôi thay đổi mã thành -'var form_model = locals.form_data || {} 'Tôi vẫn nhận được một lỗi, như trình biên dịch nói rằng' form_data' không tồn tại. Tôi không hiểu điều này, vì điều này sẽ làm việc với Javascript bình thường. Liên quan đến điểm 2 Tôi đã thực hiện ý tưởng của bạn về việc truyền dữ liệu qua lại cho khung nhìn, trong trường hợp của tôi, tôi chuyển 'req.form' –

+0

woops, bạn đúng form_model luôn {} trong mã của tôi. Tôi sẽ cập nhật nó. Tôi cũng chỉ nhận thấy nó thực sự nên là locals.form_model. – Pickels

Các vấn đề liên quan