質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • JavaScript

    16322questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Node.js

    1852questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • PostgreSQL

    1057questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

  • WebSocket

    169questions

    WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Node.jsを使用したwebsocketサーバからPostgreSQLのDBにアクセスしたい。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 253

tomo117722

score 2

環境:
Windows10
Node.js(v6.10.3)

タイトルの通りです。
Node.js + WebSocket + node-postgres 
を使用しています。

クライアントからメッセージを受信したらPostgresのDB
にserect文を発行し結果を返すプログラムを作成しています。
色々なサイトを参考にさせていただき、
上記処理は動くようになったのですが、2回目のメッセージ受信時、
connectのタイミングで"Client has already connected"のエラーが発生してしまいます。

そこで、質問として
・pgClient.endをコールしたタイミングで接続は切れないのでしょうか?
・接続を切るにはどうすればよいでしょうか?
・都度connectするのではなくサーバアプリ起動時にconnectし、
ずっと繋ぎっぱなしにするのが正しいのでしょうか?(endは呼ばない)
(その場合、アプリ終了時にendをコール?)

大変初的な質問で申し訳ありませんが、宜しくお願い致します。

var server = require('ws').Server;
var s = new server({ port:8080 });

var pg = require('pg');
var pgClinat = new pg.Client({
    user: 'postgres',
    host: 'localhost',
    database: 'sample',
    password: 'password',
    port: '5432',
})

s.on('connection',function(ws){
    console.log("connect a cliant");

    ws.on('message',function(message){
        console.log("received: "+message);

        pgClinat.connect(function(err){
            if(err){
                return console.error('connect error : ',err);
            }
            pgClinat.query('SELECT * FROM TESTTABLE2',(err,res)=>{
                if(err){
                    return console.error('query error : ',err);
                }

                var resTxt = JSON.stringify(res.rows[0]);
                s.clients.forEach(function(client) {
                    client.send(resTxt);
                });

                pgClinat.end(function(){
                    console.log('connection end ');
                });
            })
        });
    })

    ws.on('close',function(){
        console.log("lost a cliant");
    })
})
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

以下のように変更し、pgClientを毎回生成すれば行けると思います。
てかteratailってdiffの色付け表示してくれないんですね。

 var server = require('ws').Server;
 var s = new server({ port:8080 });

 var pg = require('pg');
-var pgClinat = new pg.Client({
+var CLIENT_CONFIG = {
     user: 'postgres',
     host: 'localhost',
     database: 'sample',
     password: 'password',
     port: '5432',
-})
+};

 s.on('connection',function(ws){
     console.log("connect a cliant");

     ws.on('message',function(message){
         console.log("received: "+message);

+        var pgClinat = new pg.Client(CLIENT_CONFIG);
         pgClinat.connect(function(err){
             if(err){
                 return console.error('connect error : ',err);
             }
             pgClinat.query('SELECT * FROM TESTTABLE2',(err,res)=>{
                 if(err){
                     return console.error('query error : ',err);
                 }

                 var resTxt = JSON.stringify(res.rows[0]);
                 s.clients.forEach(function(client) {
                     client.send(resTxt);
                 });

                 pgClinat.end(function(){
                     console.log('connection end ');
                 });
             })
         });
     })

     ws.on('close',function(){
         console.log("lost a cliant");
     })
 })

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/25 10:26

    回答頂き、ありがとうございます。
    返信が遅くなりすみませんでした・・

    出来ました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    16322questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Node.js

    1852questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • PostgreSQL

    1057questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

  • WebSocket

    169questions

    WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。