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

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

応答オブジェクト (サーバーのコールバック関数 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 が指定されていてもすぐに応答します。現時点では応答がまだ処理中です。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!