2013-03-22 11 views
33

questo è esempio modulo in html:Node.js - Come inviare i dati da HTML a esprimere

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8" /> 
<title>CSS3 Contact Form</title> 
</head> 
<body> 
<div id="contact"> 
    <h1>Send an email</h1> 
    <form action="/myaction" method="post"> 
     <fieldset> 
      <label for="name">Name:</label> 
      <input type="text" id="name" name="name" placeholder="Enter your full name" /> 

      <label for="email">Email:</label> 
      <input type="email" id="email" placeholder="Enter your email address" /> 

      <label for="message">Message:</label> 
      <textarea id="message" placeholder="What's on your mind?"></textarea> 

      <input type="submit" value="Send message" /> 

     </fieldset> 
    </form> 
</div> 
</body> 
</html> 

e questa è la funzione node.js che girano sul server:

var sys = require('sys'), 
    http = require('http'); 
    http.createServer(function (req, res) { 
      switch (req.url) 
       case '/myaction': 
         res.end(?????); 
        break; 
      } 
    }).listen(8080); 
sys.puts('Server running at http://127.0.0.1:8080/'); 

I hai 2 domande:

  1. Come posso chiamare la funzione myaction nel file node.js dalla pagina html? Poiché il file html viene eseguito sulla porta 80 e node.js su 8080 (quando provo a spostare node.js sulla porta 80 scrive "// non gestito" errore "evento")
  2. Nella funzione node.js dove I mettere "?????" come posso ottenere i dati dal modulo html. Quando digito req.html.body.name non ottengo i dati ...
+1

Hai mai pensato di utilizzare Express? Ha un gestore integrato per le forme. Lo uso con grande successo pubblicando moduli. –

risposta

78

Utilizzando http.createServer è molto basso livello e davvero non utile per la creazione di applicazioni web così com'è.

Un buon framework da utilizzare sopra è Express e suggerisco seriamente di usarlo. Puoi installarlo usando npm install express.

Quando si dispone, è possibile creare una domanda di base per gestire il modulo:

var express = require('express'); 
var bodyParser = require('body-parser'); 
var app  = express(); 

//Note that in version 4 of express, express.bodyParser() was 
//deprecated in favor of a separate 'body-parser' module. 
app.use(bodyParser.urlencoded({ extended: true })); 

//app.use(express.bodyParser()); 

app.post('/myaction', function(req, res) { 
    res.send('You sent the name "' + req.body.name + '".'); 
}); 

app.listen(8080, function() { 
    console.log('Server running at http://127.0.0.1:8080/'); 
}); 

Si può fare il vostro punto modulo ad esso utilizzando:

<form action="http://127.0.0.1:8080/myaction" method="post"> 

Il motivo si puo' t eseguire il nodo sulla porta 80 è perché c'è già un processo in esecuzione su quella porta (che sta servendo il tuo index.html). È possibile utilizzare Express per pubblicare anche contenuto statico, ad esempio index.html, utilizzando il middleware express.static.

+1

Errore durante la compilazione, "Errore: impossibile impostare le intestazioni dopo che sono state inviate ........" – vineet

+4

@chotesah che non è correlato al codice pubblicato qui, ma un problema nella tua app. – robertklep

0

mi piacerebbe approfondire di Obertklep (la persona prima risposta mi di):

Nel suo esempio è un modulo NPM chiamato "corpo-parser" che sta facendo la maggior parte del lavoro, dove inserisce "req.body.name", credo che stia usando body parser per ottenere il contenuto dell'attributo nome/i (non è sicuro quale uno in particolare in quanto il modulo ha più) che viene ricevuto quando il modulo è presentato.

Se si desidera non utilizzare Express, è possibile eseguire questa utilizzando "querystring", che è un modulo incorporato Node - vedere le risposte nel link qui sotto per un esempio di come utilizzare querystring.

Potrebbe essere utile dare un'occhiata a questa risposta StackOverflow che è molto simile alla tua ricerca. How do you extract POST data in Node.js?

+0

La tua domanda è mal formulata. Si prega di leggere le linee guida SO prima di postare. – sparkplug