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

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

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

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

PostgreSQL

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

Node.js

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

1回答

3462閲覧

Client has already been connected. You cannot reuse a client. 出て、2度目以降INSERTできない

AGLAAGLA

総合スコア54

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

PostgreSQL

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

Node.js

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2021/12/20 05:46

編集2021/12/20 10:54

前提・実現したいこと

ラズベリーパイからHTTP通信でダミーデータを送信しPostgreSQLに値を挿入したいと考えています。
現在の状況は1度目のダミーデータはinsertできているのですが、2度目以降はエラーが出て挿入できません。
1度目のデータは挿入できているので、通信は成功していると思っていますが、それ以降通信がうまくいかず困っています。

発生している問題・エラーメッセージ

home@ex:~/ home$ node receive.js POST "Python-urllib/3.9" Client Request > {"time": "2021-12-20 14:23:23.452887", "sensor": 1, "sound": 50} 接続完了 Result { command: 'INSERT', rowCount: 1, oid: 0, rows: [], fields: [], _parsers: undefined, _types: TypeOverrides { _types: { getTypeParser: [Function: getTypeParser], setTypeParser: [Function: setTypeParser], arrayParser: [Object], builtins: [Object] }, text: {}, binary: {} }, RowCtor: null, rowAsArray: false } POST "Python-urllib/3.9" Client Request > {"time": "2021-12-20 14:23:30.707235", "sensor": 1, "sound": 50} Error: Client has already been connected. You cannot reuse a client. at Client._connect (/home/node_modules/pg/lib/client.js:94:19) at _Promise (/home/node_modules/pg/lib/client.js:166:12) at new Promise (<anonymous>) at Client.connect (/home/node_modules/pg/lib/client.js:165:12) at IncomingMessage.<anonymous> (/home/receive.js:87:11) at IncomingMessage.emit (events.js:198:13) at addChunk (_stream_readable.js:288:12) at readableAddChunk (_stream_readable.js:269:11) at IncomingMessage.Readable.push (_stream_readable.js:224:10) at HTTPParser.parserOnBody (_http_common.js:122:22)

該当のソースコード

javascript

1require('pg').defaults.ssl = true; 2const { Client } = require('pg') 3process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 4 5const pg = new Client({ 6 user: '', 7 host: '', 8 database: '', 9 password: '', 10 port: 5432, 11 12}) 13 14 15// 通信に必要なライブラリを読み込み 16var http = require('http'); 17 18// HTTPサーバの実行 19var server = http.createServer(); 20 21 22var fs = require("fs"); 23 24 25server.on('request', function(req,res){ 26 if(req.method == 'POST'){ 27 res.writeHead(200, {'Content-Type' : req.headers['content-type']}); 28 29 req.on('data', function(data){ 30 31 // JSON形式のデータの解釈 32 json_data = JSON.parse(data); 33 var senserid = json_data.sensor; 34 var sound = json_data.carbon; 35 36 37 38 const sqltime="SET TIME ZONE 'Asia/Tokyo'" 39 const sql = "INSERT INTO sensor (time,place,conges) VALUES (current_timestamp, $1, $2)" 40 const values = [senserid, sound] 41 42 43 44 // ラズパイから受信したデータ(文字列)を、文字列に変換(受信ログ用) 45 var text = data.toString('utf8'); 46 // データの入力履歴をラズパイに返信 47 res.write('Successfully Received > ' + text); 48 49 50 51 // 受信ログを表示 52 console.log(req.method + ' "' + req.headers['user-agent'] + '"'); 53 console.log('Client Request > ' + data); 54 55 pg.connect() 56 .then(() => console.log("接続完了")) 57 .then(() => pg.query(sqltime)) 58 .then(() => pg.query(sql, values)) 59 .then(result => console.log(result)) 60 .catch((err => console.log(err))) 61 .finally((() => pg.end())) 62 63 64 65 }); 66 67 // ラズパイから全てのデータを受信したときの処理(コールバック関数) 68 req.on('end', function(){ 69 // ラズパイへのデータの返信を終了 70 res.end(); 71 }); 72 73 } 74 // ラズパイからのアクセスがPOST以外の場合 75 else { 76 res.writeHead(200, {'Content-Type': 'text/plain'}); 77 res.write('Hello World\n'); 78 res.end(); 79 } 80}); 81 82// ラズパイからの接続を待ち受けるポート番号の設定 83server.listen(8080); 84 85

###プログラム実行後のデータベースの中身

PostgreSQL

1id | time | senserid | sound 2----+----------------------------+-------+-------- 3 1 | 2021-12-20 14:05:05.225285 | 1 | 10 4(1 row)

試したこと

クライアントを再利用できないと言われたので色々試し、数時間試行錯誤しましたが、解決しないため質問させていただきます。
ご教授のほどよろしくお願いいたします。

--------追記-----------
こちらの記事を参考にしてみましたが、少し理解ができずに困っています。

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

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

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

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

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

guest

回答1

0

自己解決

公式ドキュメントを閲覧するとこちらが見つかりました。
こちらの通り、頻繁に何度もクエリを実行するアプリケーションの場合は接続プールを使用するといいとのことです。

投稿2021/12/20 12:53

AGLAAGLA

総合スコア54

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問