ホームページ >ウェブフロントエンド >jsチュートリアル >簡単にnodejsサーバーを作成する(9):ノンブロッキングoperationsを実装する_node.js

簡単にnodejsサーバーを作成する(9):ノンブロッキングoperationsを実装する_node.js

WBOY
WBOYオリジナル
2016-05-16 16:25:521422ブラウズ

応答オブジェクト (サーバーのコールバック関数 onRequest() から取得) をリクエスト ルートを通じてリクエスト ハンドラーに渡したいと考えています。ハンドラーは、そのオブジェクトの関数を使用してリクエストに応答できます。

まず、server.js に変更を加えてみましょう:

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

var http = require("http");
var url = require("url");
function start(route, handle) {
function onRequest(リクエスト, レスポンス) {
var pathname = url.parse(request.url).pathname;
console.log("パス名" のリクエストを受信しました。"); ルート(ハンドル、パス名、応答); }
http.createServer(onRequest).listen(8888);
console.log("サーバーが起動しました。");
}
exports.start = 開始;


応答オブジェクトを 3 番目のパラメーターとして Route() 関数に渡し、onRequest() ハンドラー内のすべての応答関連の関数呼び出しを削除します。これは、作業のこの部分を Route() によって実行するためです。 ) 関数を完了します。

次に router.js を変更します:

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


同じパターン: リクエスト ハンドラーから戻り値を取得する代わりに、今回はレスポンス オブジェクトが直接渡されます。 処理する対応するリクエスト プロセッサがない場合は、直接「404」エラーが返されます。

次に requestHandler.js を変更します:

コードをコピーします コードは次のとおりです:
var exec = require("child_process").exec;
関数開始(応答) {
console.log("リクエストハンドラー「start」が呼び出されました。");
exec("ls -lah", function (error, stdout, stderr) {
response.writeHead(200, {"Content-Type": "text/plain"});
応答.write(stdout);
応答.end();
});
}

関数アップロード(応答) {
console.log("リクエストハンドラー「アップロード」が呼び出されました。");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("こんにちはアップロード");
応答.end();
}

exports.start = 開始;
exports.upload = アップロード;


ハンドラー関数は、リクエストに直接応答するために応答パラメーターを受け取る必要があります。開始ハンドラーは exec() の匿名コールバック関数で要求応答操作を実行しますが、アップロード ハンドラーは単に「Hello World」と応答しますが、今回は応答オブジェクトを使用します。

/start ハンドラーでの時間のかかる操作によって /upload リクエストへの即時応答がブロックされないことを証明したい場合は、requestHandlers.js を次の形式に変更できます。

コードをコピーします コードは次のとおりです:
var exec = require("child_process").exec;
関数開始(応答) {
console.log("リクエストハンドラー「start」が呼び出されました。");
exec("検索 /",
{ タイムアウト: 10000, maxBuffer: 20000*1024 },
関数 (エラー、標準出力、標準エラー出力) {
response.writeHead(200, {"Content-Type": "text/plain"});
応答.write(stdout);
応答.end();
}
);
}

関数アップロード(応答) {
console.log("リクエストハンドラー「アップロード」が呼び出されました。");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("こんにちはアップロード");
応答.end();
}

exports.start = 開始;
exports.upload = アップロード;

このように、http://localhost:8888/start をリクエストするとロードに 10 秒かかりますが、http://localhost:8888/upload をリクエストすると、/start が指定されていてもすぐに応答します。現時点では応答がまだ処理中です。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。