応答オブジェクト(サーバーのコールバック関数onrequest()からリクエストルーティングを介してリクエストハンドラーに渡す必要があります。ハンドラーは、オブジェクト上の関数を使用してリクエストに応答できます。
最初にserver.jsに変更を加えましょう:
コードコピーは次のとおりです。
var http = require( "http");
var url = require( "url");
関数開始(ルート、ハンドル){
function onrequest(request、response){
var pathname = url.parse(request.url).pathname;
console.log( "request for" + pathname + "受信");
ルート(ハンドル、パス名、応答);
}
http.createserver(onrequest).listen(8888);
console.log( "サーバーが開始されました。");
}
exports.start = start;
応答オブジェクトを3番目のパラメーターとしてルート()関数に渡し、onrequest()ハンドラーのすべての応答コールを削除します。これは、作業のこの部分がルート()機能を完了させることを望んでいるためです。
次に、router.jsを変更します:
コードコピーは次のとおりです。
関数ルート(ハンドル、パス名、応答){
console.log( "" + pathnameのリクエストをルーティングしようとしています);
if(typeof handle [pathname] === 'function'){
[pathname](response);
} それ以外 {
console.log( "" + pathnameのリクエストハンドラーは見つかりません);
Response.writehead(404、{"content-type": "text/plain"});
Response.write( "404 not not fund");
Response.End();
}
}
exports.route = route;
同じパターン:リクエストハンドラーからの戻り値の以前の取得と比較して、今回は代わりに、応答オブジェクトに直接渡されます。対応するリクエストプロセッサが処理されない場合は、「404」エラーを直接返します。
次に、requesthandler.jsを変更します:
コードコピーは次のとおりです。
var exec = require( "child_process")。exec;
関数開始(応答){
console.log( "request handler 'start'が呼び出されました。");
exec( "ls -lah"、function(error、stdout、stderr){
Response.writehead(200、{"content-type": "text/plain"});
Response.write(stdout);
Response.End();
});
}
関数アップロード(応答){
console.log( "要求ハンドラー 'アップロード'が呼び出されました。");
Response.writehead(200、{"content-type": "text/plain"});
Response.Write( "Hello Upload");
Response.End();
}
exports.start = start;
exports.upload = upload;
ハンドラー機能は、リクエストに直接応答するために応答パラメーターを受信する必要があります。 Start Handlerは、exec()の匿名コールバック関数でリクエスト応答操作を実行しますが、アップロードハンドラーはまだ「Hello World」に返信するだけですが、今回は応答オブジェクトを使用しています。
/startハンドラーの時間のかかる操作が /アップロード要求に対する即時の応答をブロックしないことを証明したい場合は、requesthandlers.jsを次の形式に変更できます。
コードコピーは次のとおりです。
var exec = require( "child_process")。exec;
関数開始(応答){
console.log( "request handler 'start'が呼び出されました。");
exec( "Find /"、
{タイムアウト:10000、maxbuffer:20000*1024}、
関数(エラー、stdout、stderr){
Response.writehead(200、{"content-type": "text/plain"});
Response.write(stdout);
Response.End();
}
);
}
関数アップロード(応答){
console.log( "要求ハンドラー 'アップロード'が呼び出されました。");
Response.writehead(200、{"content-type": "text/plain"});
Response.Write( "Hello Upload");
Response.End();
}
exports.start = start;
exports.upload = upload;
このようにして、http:// localhost:8888/startを要求すると、ロードに10秒かかり、http:// localhost:8888/uploadを要求すると、/開始応答がまだ処理されていても、すぐに応答します。