HmNodeJS Node用のJS側の「正しい終了記述」

  • 概要

    ここでは、HmNodeJSの利用において、Node側が利用する.jsの正しい終了方法の記述を説明します。
    なぜ正しい記述が必要なのかというと、HmNoceJSは秀丸エディタが全て終了すると、
    自身が起動した各チャンネルに割り当てたnode.jsを全て終了
    します。

    しかし、
    ・本当に終了して良いタイミングなのか?
    ・後処理をする必要があるのか?
    などは、チャンネル番号に紐づけられたnode.jsが実行しているjavascript自身でないとわかりません。

    よって、HmNodeJSは終了リクエストとして「query_node_terminate」という文字列を、
    対象のチャンネル番号のnode.exeの標準入力へと送信するので、
    その文字列を受け取ったら、nodeが自分自身のプロセスを正しく終了するよう、以下のように記載しておくのが理想的です。

  • Node側が利用する .js における、正しい終了のための記述

    var http = require('http');
    var url = require('url');
    var qs = require('querystring');
    
    var port = process.argv[2]
    
    var server = http.createServer();
    server.on('request', doRequest);
    server.listen(port);
    
    console.log('Server running!');
    
    // リクエストの処理
    function doRequest(req, res) {
        var data = "aaa";
    
        // GETリクエストだったら
        if (req.method === 'GET') {
            var url_parts = url.parse(req.url,true);
            console.log(url_parts);
            data += url_parts.query["word1"];
            data += url_parts.query["myppp"];
        }
    
        res.writeHead(200, { 'Content-Type': 'text/plain' });
        res.write(data);
        res.end();
        console.log("ノード側:OK");
    }
    
    /*
     * ここから下が、正しい終了記述の典型的なパターン。
     * 「query_node_terminate」という文字列が標準入力にインプットされると、
     * この.jsを起動したnodeを終了する。
     */
    var readline = require('readline'),
    rl = readline.createInterface(process.stdin, process.stdout);
    
    rl.on('line', doLine);
    rl.on('close', doClose);
    
    function doLine(line) {
        switch(line.trim()) {
            case 'query_node_terminate':
                rl.close();
                process.stdin.destroy();
                break;
            default:
                break;
        }
    }
    
    function doClose() {
        process.exit(0);
    }
    
    console.log('running!');