簡単にnodejsサーバーを作成する(10): POSTリクエストの処理_node.js

WBOY
リリース: 2016-05-16 16:25:42
オリジナル
1225 人が閲覧しました

これまで構築したサーバーは実用的ではありませんでした。次に、実際に役立つ機能をいくつか実装していきます。

私たちがやりたいことは、ユーザーがファイルを選択し、そのファイルをアップロードし、アップロードされたファイルをブラウザーで確認することです。

まず、ユーザーがコンテンツを入力し、POST リクエストを通じてサーバーに送信するためのテキスト領域が必要です。

開始イベント ハンドラーにコードを追加し、requestHandlers.js を次のように変更します。

コードをコピーします コードは次のとおりです:

関数開始(応答) {
console.log("リクエストハンドラー「start」が呼び出されました。");
var body = ''
''
''
'<ボディ>'
'<フォームアクション="/アップロード"メソッド="ポスト">' '' '' ''
''
'';
response.writeHead(200, {"Content-Type": "text/html"});
応答.write(本文);
応答.end();
}
関数アップロード(応答) {
console.log("リクエストハンドラー「アップロード」が呼び出されました。");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("こんにちはアップロード");
応答.end();
}
exports.start = 開始;
exports.upload = アップロード;



ブラウザで http://localhost:8888/start にアクセスすると、効果を確認できます。
次に、ユーザーがフォームを送信したときに POST リクエストをトリガーするために /upload リクエスト ハンドラーを実装する必要があります。

プロセス全体をノンブロッキングにするために、Node.js は POST データを多くの小さなデータ チャンクに分割し、特定のイベントをトリガーしてこれらの小さなデータ チャンクをコールバック関数に渡します。ここでの特定のイベントには、データ イベント (新しい小さなデータ ブロックが到着したことを示す) と終了イベント (すべてのデータが受信されたことを示す) が含まれます。

これを行うには、リクエスト オブジェクトにリスナーを登録します。ここでのリクエスト オブジェクトは、HTTP リクエストが受信されるたびに onRequest コールバック関数に渡されます。

コードをサーバーに配置し、server.js を次のように変更します。

コードをコピーします コードは次のとおりです: var http = require("http");
var url = require("url");
function start(route, handle) {
function onRequest(リクエスト, レスポンス) {
var postData = "";
var pathname = url.parse(request.url).pathname;
console.log("「 pathname " のリクエストを受信しました。」);
request.setEncoding("utf8");
request.addListener("データ", function(postDataChunk) {
PostData = postDataChunk;
console.log("受信した POST データ チャンク '" postDataChunk "'.");
});
request.addListener("終了", function() {
ルート(ハンドル、パス名、応答、postData);
});
}
http.createServer(onRequest).listen(8888);
console.log("サーバーが起動しました。");
}
exports.start = 開始;



上記のコードは 3 つのことを行います。まず、受信したデータのエンコード形式を UTF-8 に設定し、次に「data」イベントのリスナーを登録して、受信した新しいデータ ブロックをそれぞれ収集し、それを最後に、リクエスト ルーティング呼び出しを終了イベント ハンドラーに移動して、すべてのデータが受信されたときにのみ、かつ 1 回だけ呼び出しが実行されるようにします。このデータはリクエスト ハンドラーによって使用されるため、POST データもリクエスト ルーターに渡します。
次に、/uploadページにユーザーが入力した内容が表示されます

router.js を変更しましょう:

コードをコピー コードは次のとおりです:

関数ルート(ハンドル、パス名、応答、postData) {
console.log("パス名に対するリクエストをルーティングしようとしています);
if (ハンドルの種類[パス名] === '関数') {
ハンドル[パス名](応答, postData);
} else {
console.log("パス名に対するリクエスト ハンドラーが見つかりません);
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("404 見つかりません");
応答.end();
}
}
exports.route = ルート;

次に、requestHandlers.js で、アップロード リクエストへの応答にデータを含めます。

コードをコピーします コードは次のとおりです:

function start(response, postData) {
console.log("リクエストハンドラー「start」が呼び出されました。");
var body = ''
'<頭>'
''
''
'<ボディ>'
'<フォームアクション="/アップロード"メソッド="ポスト">' '' '' ''
''
'';
response.writeHead(200, {"Content-Type": "text/html"});
応答.write(本文);
応答.end();
}
関数アップロード(応答、postData) {
console.log("リクエストハンドラー「アップロード」が呼び出されました。");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("送信しました: " postData);
応答.end();
}
exports.start = 開始;
exports.upload = アップロード;



最後に行うべきことは次のとおりです。現在、リクエストのメッセージ本文全体をリクエスト ルートとリクエスト ハンドラーに渡します。 POST データのうち関心のある部分のみをリクエスト ルートとリクエスト ハンドラーに渡す必要があります。この例では、実際にはテキスト フィールドのみに関心があります。
前に紹介したクエリ文字列モジュールを使用できます:

コードをコピーします コードは次のとおりです: var querystring = require("querystring");
function start(response, postData) {
console.log("リクエストハンドラー「start」が呼び出されました。");
var body = ''
'<頭>'
''
''
'<ボディ>'
'<フォームアクション="/アップロード"メソッド="ポスト">' '' '' ''
''
'';
response.writeHead(200, {"Content-Type": "text/html"});
応答.write(本文);
応答.end();
}
関数アップロード(応答、postData) {
console.log("リクエストハンドラー「アップロード」が呼び出されました。");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("次のテキストを送信しました: " querystring.parse(postData).text);
応答.end();
}
exports.start = 開始;
exports.upload = アップロード;



OK、POST データの処理については以上です。

次のセクションでは、画像アップロード機能を実装します。
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート