node.jsはchild_processを使用してノンブロッキングにできることはわかりましたが、非同期でコールバック関数が処理されます。
そのため、コールバック関数の結果をブラウザに表示したい場合はレスポンスのオブジェクト自体を。
以下はserver.jsを書き直した例です。router.routeメソッドにresを追加しています。
var http = require('http');
var url = require('url');
var router = require('./router');
var requestHandler = require('./requestHandler');
var handle = new Object();
handle["/"] = requestHandler.start;
handle["/start"] = requestHandler.start;
handle["/end"] = requestHandler.end;
var server = http.createServer(function(req, res){
var pathname = url.parse(req.url).pathname;
var query = url.parse(req.url).query;
router.route(pathname,handle,res);
});
server.listen(8084,'127.0.0.1');
console.log('server start');
次にrouter.jsを書き直します。
function route(pathname,handle,res) {
if (typeof handle[pathname] === 'function') {
handle[pathname](res);
} else {
res.writeHead(404, {"Content-Type": "text/html"});
res.end();
}
}
exports.route = route;
requestHandler.jsにresを引数として渡し、returnするのをやめています。レスポンスは全てrequestHandler.jsが行います。
もう一つ大事なのは、存在しないパスがわたってきた場合、
res.writeHeadで404を返すようにします。
そうしないと存在しないパスでリクエストがあった場合、サーバから応答がないため、ブラウザは延々と待ち続ける状態になってしまいます。
以下、requestHandler.jsです。
var exec = require('child_process').exec;
function start(res) {
exec('dir', function (error, stdout, stderr) {
res.writeHead(200, {"Content-Type": "text/plain charset=UTF-8"});
res.write(stdout);
res.end();
});
}
function end(res) {
res.writeHead(200, {"Content-Type": "text/plain charset=UTF-8"});
res.write("end");
res.end();
}
exports.start = start;
exports.end = end;
この状態で再起動してから、
http://localhost:8084/startにアクセスしてください。
以下のようにdirコマンドの結果が表示されるはずです。
ブラウザ画面