Node.js - Как отправить данные из HTML, чтобы выразить

Это пример формы в 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>

и это функция node.js, которая запускается на сервере:

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

У меня есть 2 вопроса:

  1. Как я могу позвонить myaction функция в файле node.js со страницы HTML? Поскольку html-файл работает на порте 80 и node.js на 8080 (когда я пытаюсь переместить node.js на порт 80, он пишет "// Unhandled 'error' event")
  2. В функции node.js, где я ставлю "?????" Как я могу получить данные из формы HTML. Когда я набираю req.html.body.name, я не получаю данные...

2 ответа

Решение

С помощью http.createServer очень низкоуровневый и действительно бесполезный для создания веб-приложений как есть.

Хороший фреймворк для его использования - Express, и я бы серьезно предложил его использовать. Вы можете установить его используя npm install express,

Когда у вас есть, вы можете создать базовое приложение для обработки вашей формы:

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

Вы можете указать свою форму, используя:

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

Причина, по которой вы не можете запустить Node на порту 80, заключается в том, что на этом порту уже запущен процесс (который обслуживает ваш index.html). Вы можете использовать Express, чтобы также обслуживать статический контент, например index.html, с использованием express.static промежуточное программное обеспечение.

Я хотел бы расширить ответ Обертклепа. В его примере это модуль NPM под названием body-parser который делает большую часть работы. Куда он кладет req.body.nameЯ считаю, что он / она использует body-parser чтобы получить содержимое атрибута (ов) имени, полученных при отправке формы.

Если вы не хотите использовать Express, используйте querystring который является встроенным модулем Node. Смотрите ответы в ссылке ниже для примера того, как использовать querystring,

Это может помочь посмотреть на этот ответ, который очень похож на ваш квест.

Другие вопросы по тегам