2012-08-10 19 views
5

Sto utilizzando Node.js, Express e Jade e sto cercando di capire come pubblicare, convalidare i dati del modulo di elaborazione &.Node.js, Express e Jade - Moduli

Nel mio file di giada creo un modulo di contatto:

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 

Sto quindi utilizzando il modulo 'esprimere-validator' per validare il form come segue:

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

Quindi ci sono tre scenari in cui vengono visualizzate le mie pagine e ognuna ha accesso a diverse variabili locali:

  1. Quando la pagina viene caricata per la prima volta (errori = indefinito, successo = indefinito)
  2. Quando il modulo viene inviato e vi sono errori (errori = array, successo = indefinito)
  3. Quando il modulo viene inviato e non vi sono errori (errori = indefiniti , il successo = true)

Così i miei problemi principali sono che:

  1. quando la mia pagina Jade è caricato, sembra gettare un errore quando tento di accedere a una variabile che non esiste. Per esempio, voglio vedere se la variabile 'successo' è impostata, e se lo è voglio nascondere il modulo e visualizzare un messaggio di ringraziamento. C'è un modo semplice per gestire una variabile in Jade che sarà indefinita o un valore?
  2. Quando il modulo è stato inviato e ci sono errori di convalida, voglio mostrare un messaggio di errore (questo non è un problema) ma anche compilare il modulo con le variabili che sono state precedentemente inviate (ad esempio se l'utente ha fornito un nome ma nessuna email, l'errore dovrebbe fare riferimento all'e-mail vuota ma il modulo dovrebbe mantenere il loro nome). Al momento viene visualizzato il messaggio di errore, ma il mio modulo viene ripristinato. C'è un modo semplice per impostare i valori di input dei campi sui valori nei dati del post?

risposta

1
  1. È possibile risolvere che utilizzando locals.variable invece di variabile. Inoltre puoi usare javascript in jade.

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

  2. Ho usato due modi per risolvere questo problema. Il primo è il re-rendering della vista e si passa il req.body come locale. Ho una convenzione secondo cui i miei moduli usano form_model.value per i loro valori di campo. Questo metodo funziona bene per i moduli semplici ma inizia a frammentarsi un po 'quando la tua forma si basa sui dati.

    Il secondo metodo consiste nel passare il req.body alla sessione, quindi reindirizzare a una route che esegue il rendering del modulo. Avere quella rotta alla ricerca di una certa variabile di sessione e utilizzare quei valori nel modulo.

+0

Ciao grazie per la risposta. Tuttavia, non sarebbe il tuo codice '-var form_model = {} || locals.form_data; 'imposta sempre' form_model = {} ', dato che' {} 'è un oggetto (non indefinito) e quindi il' locals.form_data' non sarà mai valutato? Se cambio il codice in -'var form_model = locals.form_data || {} 'Ricevo ancora un errore, poiché il compilatore dice che' form_data' non esiste. Non lo capisco, in quanto dovrebbe funzionare con Javascript normale. Per quanto riguarda il punto 2 ho implementato la tua idea di passare i dati attraverso la vista, nel mio caso passo 'req.form' –

+0

woops, hai ragione form_model è sempre {} nel mio codice. Lo aggiornerò. Ho anche notato che dovrebbe essere locals.form_model. – Pickels

Problemi correlati