web-dev-qa-db-fra.com

Node.js - Comment envoyer des données de HTML à exprimer

voici un exemple de formulaire en HTML:

<!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>

et c'est la fonction node.js qui s'exécute sur le serveur:

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/');

J'ai 2 questions:

  1. Comment appeler myaction function dans le fichier node.js à partir de la page HTML? Parce que le fichier html s'exécute sur le port 80 et node.js sur 8080 (lorsque j'essaie de déplacer le node.js sur le port 80, il écrit "// événement non traité d'erreur")
  2. Dans la fonction node.js où je mets "?????" Comment puis-je obtenir des données à partir du formulaire HTML? Lorsque je tape req.html.body.name, je ne reçois pas les données ...
39
royb

En utilisant http.createServer est de très bas niveau et n'est vraiment pas utile pour créer des applications Web en l'état.

Express est un bon framework à utiliser, et je suggérerais sérieusement de l’utiliser. Vous pouvez l'installer avec npm install express.

Lorsque vous avez, vous pouvez créer une application de base pour gérer votre formulaire:

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

Vous pouvez y faire pointer votre formulaire en utilisant:

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

La raison pour laquelle vous ne pouvez pas exécuter Node sur le port 80) est qu’un processus est déjà en cours d’exécution sur ce port (qui sert votre index.html). Vous pouvez utiliser Express pour diffuser également du contenu statique, comme index.html, en utilisant le express.static middleware.

90
robertklep

J'aimerais développer la réponse d'Obertklep. Dans son exemple, il s’agit d’un module NPM appelé body-parser qui fait l'essentiel du travail. Où il met req.body.name, Je pense qu'il/elle utilise body-parser pour obtenir le contenu du ou des attributs de nom reçus lors de l'envoi du formulaire.

Si vous ne souhaitez pas utiliser Express, utilisez querystring qui est un module intégré Node. Consultez les réponses dans le lien ci-dessous pour obtenir un exemple d'utilisation de querystring.

Cela pourrait aider de regarder cette réponse , qui est très similaire à votre quête.

0
Programmerion