2011-12-24 14 views
7

Io uso node.js ed express. Quando premo il pulsante (btnSend), voglio inviare i dati a node.js da espresso (senza aggiornare la pagina). Come posso inviare i dati? Usando jquery?Node.js - invia modulo

Per favore aiuto.

Grazie per il consiglio.

<form action="/Send" method="post"> 
Username: 
<input type="text" name="user" id="txtUser" /> 
<input type="submit" value="Submit" id="btnSend" /> 
</form> 
+1

Questo è fuori tema, ma considera l'opzione "Nome utente:" e l'elemento di immissione del testo con un [tag etichetta] (https://developer.mozilla.org/en/HTML/Element/label). Rende la forma un po 'più semantica e utilizzabile. – Xavi

risposta

15

Ecco un abbozzo di ciò che il jQuery dovrebbe essere simile:

$("form").submit(function(e) { 
    e.preventDefault(); // Prevents the page from refreshing 
    var $this = $(this); // `this` refers to the current form element 
    $.post(
     $this.attr("action"), // Gets the URL to sent the post to 
     $this.serialize(), // Serializes form data in standard format 
     function(data) { /** code to handle response **/ }, 
     "json" // The format the response should be in 
    ); 
}); 

Questo frammento di codice trova tutti gli elementi del modulo nella pagina e in ascolto per un evento di presentare da loro. Un modulo può essere inviato in diversi modi (facendo clic su un pulsante di invio, premendo invio, ecc.), Quindi per motivi di usabilità, è meglio ascoltare per inviare eventi direttamente opposti all'ascolto per il tasto eventi di clic sui pulsanti di invio .

Quando si verifica un evento di invio, il codice sopra prima impedisce le azioni del browser predefinito (che tra l'altro aggiorna la pagina) chiamando e.preventDefault. Quindi utilizza $.post per inviare i dati del modulo all'url specificato nell'attributo action. Si noti che $.fn.serialize viene utilizzato per serializzare i dati del modulo in un formato standard.

Il codice espresso dovrebbe apparire qualcosa di simile:

var express = require('express') 
    , app = express.createServer(); 

app.use(express.bodyParser()); // Automatically parses form data 

app.post('/Send', function(req, res){ // Specifies which URL to listen for 
    // req.body -- contains form data 
}); 

app.listen(3000); 

La documentazione su express.bodyParser è un po 'scarsa, ma dopo un po' di code spelunking sembra che utilizza node-querystring sotto le coperte.

Spero che questo aiuti!

+0

Ho problemi a far scattare la funzione di risposta lato client. funzione (dati) {/ ** codice per gestire la risposta ** /}, è necessario aggiungere un res.end() o alcuni di essi al codice lato client? – CMaury

+1

No, non dovresti chiamare 'res.end' sul lato client - solo sul lato server. Nella console di sviluppo di Chrome, vorrei inserire la scheda di rete e assicurarmi che la richiesta di post si completasse senza errori. Dai anche un'occhiata al tuo codice di risposta lato server (cioè il codice nella funzione '// req.body - contains form data') e assicurati di terminare correttamente la tua risposta. Spero possa aiutare. – Xavi

+0

Sono stato in grado di limitare il problema e non è correlato a questa domanda. Per qualche motivo l'app non è in grado di trovare fs.appendfile quando si usa per sempre, ma funziona bene quando si usa nodemon. – CMaury