node.jsをノンブロッキングにする
node.jsはシングルスレッド(ブロッキング)のため、ノンブロッキングにしないと使い物になりません。
node.jsをノンブロッキングにするにはchild_processをrequireします。正確にはchild_processのexecメソッドです。
requestHandler.jsでrequireします。startメソッドを以下のように変更します。
なお、server.js、router.jsはリクエストURLとモジュールをマッピングするで記述しているのと同じとします。以下、ソースです。

var exec = require('child_process').exec;

function start() {
    exec('calc', function (error, stdout, stderr) {
        console.log('Request handler start was called.');
    });
}

function end() {
    console.log('Request handler end was called.');
}

exports.start = start;
exports.end = end;
この状態で、http://127.0.0.1:8084/startにアクセスすると、Windows環境の場合、電卓が起動します。
このexecは、ノンブロッキングを実装できます。

コマンドプロンプトを実行する
コマンドプロンプトのコマンドを実行することも可能です。
以下、dirコマンドを標準出力する例です。ファイル削除することだったりも出来ます。
dirを、例えば、del c:¥a.txtというようにするとファイル削除されます。
以下のようにrequestHandler.jsを書き換えます。startメソッドで、content変数にdirの結果を返しています。

var exec = require('child_process').exec;

function start() {
    var content = "empty";
    exec('dir', function (error, stdout, stderr) {
        content = stdout;
    });
    return content;
}

function end() {
    console.log('Request handler end was called.');
}

exports.start = start;
exports.end = end;
server.js→router.js→requestHandler.jsという流れなので、戻り値を表示するように変更します。
以下、server.jsです。

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 content = router.route(pathname,handle);
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(content + '<br />');
    res.end();
});
server.listen(8084,'127.0.0.1');

console.log('server start');
以下、router.jsです。

function route(pathname,handle) {
  if (typeof handle[pathname] === 'function') {
    return handle[pathname]();
  } else {
    console.log("No request handler found for " + pathname);
    console.log(typeof handle[pathname]);
  }
}

exports.route = route;
この状態で再起動してから、http://localhost:8084/startにアクセスしてください。

ブラウザ画面


dirコマンドの結果が表示されずに初期値が表示されます。これはノンブロッキングで動作するためにコールバック関数を使用しているからです。
コールバック関数の処理結果を待たずに、startメソッドはreturnしています。ブラウザに表示するにはnode.jsをノンブロッキングにしてブラウザに表示を参照ください。

Back to top

Information