記録として残しておきたいブログ

主にプログラミングについて書きます。現在は http://tmg0525.hatenadiary.jp/ に書いています。

Node.js error: invalid frontend message type 0 ってエラー出た

var pg = require('pg');
var http = require('http');
var fs = require('fs');
var ejs = require('ejs');


var testEjs = fs.readFileSync('public_html/postgres.ejs', 'utf-8');

// httpサーバーの作成
var server = http.createServer();

var conString = 'postgres://postgres:tmgykng324@localhost/cas_db';
var client = new pg.Client(conString);

server.on('request', function(req, res) {
    if(req.url != '/favicon.ico') {

        // postgreSQLに接続
        client.connect(function(err) {
            if(err) {
                // エラー時
                return console.error('could not connect to postgres', err);
            }

            var userData = [2];
            userData[0] = [];   // user_id
            userData[1] = [];   // create_date

            // SELECTのSQLを実行
            client.query('SELECT user_id, create_date FROM m_user;', function(err, result) {
                if(err) {
                    // エラー時
                    return console.error('error running query', err);
                }

                // 表示用に格納
                for(var i = 0; i < result.rowCount; i++) {
                    console.log(result.rows[i].user_id + ' ' + result.rows[i].create_date);
                    userData[0][i] = result.rows[i].user_id;
                    userData[1][i] = result.rows[i].create_date;
                }

                var content = ejs.render(testEjs, {
                    'userData': userData
                });

                client.on('error', function(err){
                    return console.log(err);
                });

                client.on('drain', client.end.bind(client));

                res.writeHead(200, {'Content-Type': 'text/html'});
                res.write(content);
                res.end();
            });
        });
    }
});
server.listen(8888);
console.log('server listening...');


上のコードを実行してブラウザでlocalhost:8888に2回アクセスすると

error: invalid frontend message type 0


ってエラー出た

var client = new pg.Client(conString);


この記述はリクエストイベントの中で書くべきらしい。

client.connect();

の前あたりかな?




参考サイト
javascript - Can not close postgreSQL connection within Node.js script - Stack Overflow

Node.js WEBサーバーの基礎コード(?)

var http = require('http');         // httpをロード

var server = http.createServer();   // serverオブジェクトの作成
server.on('request', doRequest);    // 'request'イベントにdoRequest関数を関連付ける
server.listen(8888);                // ポート番号8888で待ち受け開始
console.log('Server running!');

// リクエストの処理
function doRequest(req, res) {
    // ヘッダ情報
    res.writeHead(200, {'Content-Type': 'text/plain'});

    // ボディ部分
    res.write('Hello World\n');

    // コンテンツ出力の完了
    res.end();
}


require(moduleName)
モジュールを読み込んで利用可能にする
引数

  • moduleName <String>
    • 読み込みたいモジュール名


http.createServer([requestListener])
http.Serverオブジェクトを作成し、返す。
Node.jsの「サーバー」の部分


emitter.on(eventName, listener)
イベントハンドラを登録する
イベントハンドラに与えられる引数はイベントに応じて異なる。
引数

  • eventName <String>
    • イベント名
  • listener <Function>

'request'イベントにdoRequest()関数を関連付けている。
クライアントからのリクエストの処理を行う

イベントハンドラの説明=>https://mag.osdn.jp/13/03/18/0939236/3


server.listen([port][, hostname][, backlog][, callback])
サーバーの待ち受けを開始
引数

  • port <Number>
    • ポート番号

listen()関数はポート番号を指定する と覚えておく。

doRequest()内の処理

'request'イベントの場合は、イベントハンドラには2つの引数が渡される。
doReqest(request, response)

  • request
    • クライアントからのリクエストに関する機能
  • response
    • サーバーからクライアントへ送るレスポンスに関する機能

この2つの引数を使って処理していく。


response.writeHead(statusCode[, statusMessage][, headers])
ヘッダー情報をレスポンスに書き出し
response.end()が呼び出される前に呼び出すこと。
引数

今回は、「このコンテンツは標準出力ですよ」ということがクライアントに送られる。


response.write(chunk[, encoding][, callback])
ボディとなる部分のコンテンツの書き出し
何回でも.write()は呼び出せる


response.end([data][, encoding][, callback])
コンテンツの出力の完了
レスポンス処理の終わり


「writeHead」 「write」 「end」 の3つがあればクライアントへ返答できる


参考サイト
Node.jsのスクリプトの基本を覚えよう(1/5):ビギナーのための Node.jsプログラミング入門
Node.jsのスクリプトの基本を覚えよう(2/5):ビギナーのための Node.jsプログラミング入門

Node.jsで非同期処理をフロー制御する<asyncモジュール>

目次

  • 目次
  • 環境
  • Node.jsは非同期処理
  • asyncモジュール
    • series()<順次実行>
    • parallel() <並列実行>
    • waterfall() <次の関数へ引数を渡す>

環境

OS : Windows10
Node.js : v6.9.4

Node.jsは非同期処理

Node.jsは非同期処理をするプログラミング言語

順番に処理するためにコールバック関数を利用する。

コールバック関数でも対処できるがネストが多くなって見た目が良くない。


ここで、asyncモジュールを使う。

asyncモジュール

・モジュールのインストール方法こちら
・asyncの公式ドキュメントはこちら

続きを読む

Node.js 指定した時間が経過したら関数を実行する。

環境

OS: Windows10
Node.js: v6.9.4

setTimeout <時間が経過したら関数を実行>

  • setTimeOutの公式ドキュメント
  • 指定した時間が経過したら指定した関数を実行する。
// test0.js
setTimeout(function() {
    console.log('good mornming!');
}, 1000);

test0.jsの出力結果

good morning!

実行から1000ミリ秒後に 'good morning!' と表示される。


setTimeout(callback, delay[, ...args])
引数

  • callback <Function>
    • 時間が経過したときに呼び出す関数
  • delay <number>
    • callbackを呼び出す前に待機する時間(ms)
  • ...args <any>
    • callbackを呼び出すときに渡すオプションの引数

処理

  • delayで指定したミリ秒後に1度callbackの関数を呼び出す。
  • 正確な時間(ms)ではない。できるだけ近い時間(ms)になっている
  • delay > 2147483647 or delay < 1 の時はdelayは1が設定される。
  • callbackが関数ではないときは TypeErrorがスローされる。

2つsetTimeout()を書いてみる

// test1.js
setTimeout(function() {
    console.log('good mornming!');
}, 1000);

setTimeout(function() {
    console.log('hello!');
}, 500);

test1.jsの出力結果

hello!
good morning!

Node.jsは非同期処理のため、 'hello!' が先に表示されてしまう。


順番に上から処理をしたい場合は asyncモジュールで定義されている関数を使うと良い。


参考サイト
Timers | Node.js v6.9.4 Documentation

Windows10でNode.jsを使えるようにする

環境

Windows10

 

Node.jsを使ってみたくて開発するまでのメモ

 

WindowsでNode.jsを使うには
nodist
っていうツールを使うといいらしい。

 

インストール方法は以下の記事を参考にしました

qiita.com

 

続きを読む