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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

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

Node.js

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

WebSocket

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

JavaScript

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

Q&A

解決済

1回答

3854閲覧

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

tomo117722

総合スコア8

PostgreSQL

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

Node.js

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

WebSocket

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

JavaScript

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

0グッド

0クリップ

投稿2018/06/22 08:49

環境:
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をコール?)

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

javascript

1var server = require('ws').Server; 2var s = new server({ port:8080 }); 3 4var pg = require('pg'); 5var pgClinat = new pg.Client({ 6 user: 'postgres', 7 host: 'localhost', 8 database: 'sample', 9 password: 'password', 10 port: '5432', 11}) 12 13s.on('connection',function(ws){ 14 console.log("connect a cliant"); 15 16 ws.on('message',function(message){ 17 console.log("received: "+message); 18 19 pgClinat.connect(function(err){ 20 if(err){ 21 return console.error('connect error : ',err); 22 } 23 pgClinat.query('SELECT * FROM TESTTABLE2',(err,res)=>{ 24 if(err){ 25 return console.error('query error : ',err); 26 } 27 28 var resTxt = JSON.stringify(res.rows[0]); 29 s.clients.forEach(function(client) { 30 client.send(resTxt); 31 }); 32 33 pgClinat.end(function(){ 34 console.log('connection end '); 35 }); 36 }) 37 }); 38 }) 39 40 ws.on('close',function(){ 41 console.log("lost a cliant"); 42 }) 43})

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

javascript

1 var server = require('ws').Server; 2 var s = new server({ port:8080 }); 3 4 var pg = require('pg'); 5-var pgClinat = new pg.Client({ 6+var CLIENT_CONFIG = { 7 user: 'postgres', 8 host: 'localhost', 9 database: 'sample', 10 password: 'password', 11 port: '5432', 12-}) 13+}; 14 15 s.on('connection',function(ws){ 16 console.log("connect a cliant"); 17 18 ws.on('message',function(message){ 19 console.log("received: "+message); 20 21+ var pgClinat = new pg.Client(CLIENT_CONFIG); 22 pgClinat.connect(function(err){ 23 if(err){ 24 return console.error('connect error : ',err); 25 } 26 pgClinat.query('SELECT * FROM TESTTABLE2',(err,res)=>{ 27 if(err){ 28 return console.error('query error : ',err); 29 } 30 31 var resTxt = JSON.stringify(res.rows[0]); 32 s.clients.forEach(function(client) { 33 client.send(resTxt); 34 }); 35 36 pgClinat.end(function(){ 37 console.log('connection end '); 38 }); 39 }) 40 }); 41 }) 42 43 ws.on('close',function(){ 44 console.log("lost a cliant"); 45 }) 46 }) 47

投稿2018/06/22 15:16

sagami1991

総合スコア216

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomo117722

2018/06/25 01:26

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問