これは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つの質問があります。
myaction
関数を呼び出すにはどうすればよいですか? htmlファイルはポート80で実行され、node.jsは8080で実行されるため(node.jsをポート80に移動しようとすると、「// Unhandled 'error' event」と書き込まれます)http.createServer
の使用は非常に低レベルであり、Webアプリケーションをそのままの状態で作成するのには本当に役立ちません。
その上で使用するのに適したフレームワークは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">
ポート80でNodeを実行できないのは、そのポート(index.html
にサービスを提供している)で既に実行中のプロセスがあるためです。 Expressを使用して、index.html
ミドルウェアを使用して、express.static
などの静的コンテンツを提供することもできます。
Obertklepの答えを拡張したいと思います。彼の例では、body-parser
というNPMモジュールがほとんどの作業を行っています。彼がreq.body.name
を置く場所では、フォームの送信時に受け取ったname属性の内容を取得するためにbody-parser
を使用していると思います。
Expressを使用しない場合は、Nodeモジュールが組み込まれているquerystring
を使用します。 querystring
の使用方法の例については、以下のリンクの回答を参照してください。
この答え を見ると役立つかもしれません。これはあなたの探求に非常に似ています。