前提・実現したいこと
ラズベリーパイから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)
試したこと
クライアントを再利用できないと言われたので色々試し、数時間試行錯誤しましたが、解決しないため質問させていただきます。
ご教授のほどよろしくお願いいたします。
--------追記-----------
こちらの記事を参考にしてみましたが、少し理解ができずに困っています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。