45

これは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. myactionhtmlページからnode.jsの関数を呼び出すにはどうすればよいですか?htmlファイルはポート80で実行され、node.jsは8080で実行されるため(node.jsをポート80に移動しようとすると、「//未処理の「エラー」イベント」と書き込まれます)
  2. 「?????」を入れたnode.js関数に htmlフォームからデータを取得するにはどうすればよいですか。req.html.body.nameと入力すると、データが取得されません...
4

2 に答える 2

100

使用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

于 2013-03-22T11:26:58.163 に答える
2

Obertklepの答えをさらに詳しく説明したいと思います。彼の例では、body-parserほとんどの作業を実行しているのはNPMモジュールと呼ばれています。彼が置くところreq.body.name、私は彼/彼女がbody-parserフォームが提出されるときに受け取った名前属性の内容を取得するために使用していると思います。

Expressを使用したくない場合querystringは、組み込みのNodeモジュールであるExpressを使用してください。使用方法の例については、以下のリンクの回答を参照してくださいquerystring

あなたの探求に非常に似ているこの答えを見ることは助けになるかもしれません。

于 2018-01-05T00:39:29.427 に答える