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

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

新規登録して質問してみよう
ただいま回答率
87.20%
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コンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

解決済

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

AGLAAGLA
AGLAAGLA

総合スコア20

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コンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

1回答

0評価

0クリップ

475閲覧

投稿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

require('pg').defaults.ssl = true; const { Client } = require('pg') process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; const pg = new Client({ user: '', host: '', database: '', password: '', port: 5432, }) // 通信に必要なライブラリを読み込み var http = require('http'); // HTTPサーバの実行 var server = http.createServer(); var fs = require("fs"); server.on('request', function(req,res){ if(req.method == 'POST'){ res.writeHead(200, {'Content-Type' : req.headers['content-type']}); req.on('data', function(data){ // JSON形式のデータの解釈 json_data = JSON.parse(data); var senserid = json_data.sensor; var sound = json_data.carbon; const sqltime="SET TIME ZONE 'Asia/Tokyo'" const sql = "INSERT INTO sensor (time,place,conges) VALUES (current_timestamp, $1, $2)" const values = [senserid, sound] // ラズパイから受信したデータ(文字列)を、文字列に変換(受信ログ用) var text = data.toString('utf8'); // データの入力履歴をラズパイに返信 res.write('Successfully Received > ' + text); // 受信ログを表示 console.log(req.method + ' "' + req.headers['user-agent'] + '"'); console.log('Client Request > ' + data); pg.connect() .then(() => console.log("接続完了")) .then(() => pg.query(sqltime)) .then(() => pg.query(sql, values)) .then(result => console.log(result)) .catch((err => console.log(err))) .finally((() => pg.end())) }); // ラズパイから全てのデータを受信したときの処理(コールバック関数) req.on('end', function(){ // ラズパイへのデータの返信を終了 res.end(); }); } // ラズパイからのアクセスがPOST以外の場合 else { res.writeHead(200, {'Content-Type': 'text/plain'}); res.write('Hello World\n'); res.end(); } }); // ラズパイからの接続を待ち受けるポート番号の設定 server.listen(8080);

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

PostgreSQL

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

試したこと

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

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

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

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コンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。