0

heroku postgresql データベースから読み書きするメソッドを含む node.js ファイルがあります。DBにアクセスするために「pg」モジュールを使用しています。私の問題は、getSleepMode 関数を連続して 2 回以上呼び出すと、ECONNRESET エラーが発生することです。この関数は、DB にクエリを送信し、整数を取得するだけです。node.js 関数が非ブロックであり、 getSleepMode() の両方のインスタンスが同時に DB にアクセスしようとしていることが原因である可能性があることを理解しています。しかし、複数のクライアントが同時に DB からデータを取得しようとしている場合、これは問題になりませんか? 私のheroku postgresql dbが同時に複数のクライアントからのクエリを処理できると仮定すると、これはまだ機能するはずではありませんか? 以下のコードの関連部分があります。

    [database connection variables omitted]

    var pg = require("pg")
    var conString = "pg://" + USER + ":" + PW + "@" + HOST + ":" + PORT + "/" + 
         DATABASE + "?ssl=true";

    var client = new pg.Client(conString);

     /*This function accesses my database and retrieves an integer field 
      called "sleepmode"*/

    function getSleepMode(username) {

       var query = "SELECT sleepmode FROM \"Users\" where username='" + 
                    username + "';";

       connectWrapper(query, function(err,result) {
           if (err) {
                return console.err("Error getting sleep mode", err);
           } 

           client.end();
           console.log("sleepmode " + result.rows[0].sleepmode);
       });
   }


       /*This function is here so I can reuse it for more than just  
        my getSleepMode() function*/

      function connectWrapper(query, handler) {

         client.connect(function(err) {
           if (err) { 
            return console.error('could not connect to postgresq',err);
           }
           client.query(query, handler);
         });
      }

     getSleepMode("username1");  //This ALONE works
     getSleepMode("username2");  //but when this line follows, i get the error

これを実行すると、次の出力が発生します。

$user: node dbconnect.js
could not connect to postgresq { [Error: write ECONNRESET] code: 'ECONNRESET', err
ECONNRESET', syscall: 'write' }
could not connect to postgresq { [Error: write ECONNRESET] code: 'ECONNRESET', err
ECONNRESET', syscall: 'write' }

Events.js:72
       throw er; // Unhandled 'error' event
         ^
Error: write ECONNRESET
   at errnoException (net.js:904:11)
   at Socket._write (net.js:645:26)
   at doWrite (_stream_writable.js:225:10)
   at writeOrBuffer (_stream_writable.js:215:5)
   at Socket.Writable.write (_stream_writable.js:182:11)
   at Socket.write (net.js:615:40)
   at write (_stream_readable.js:601:24)
   at flow (_stream_readable.js:610:7)
   at _stream_readable.js:578:7
   at process._tickCallback (node.js:419:13)

しかし、getSleepMode() が 1 回だけ呼び出されるように実行すると、エラーは発生せず、期待どおりに動作します。

$user: node dbconnect.js
sleepmode 1
4

1 に答える 1

0

クライアントを 2 回終了している ( client.end();) ため、問題が発生している可能性があります。具体的には、他のクエリの実行が完了する前に接続が閉じられたようです。

于 2014-08-06T00:29:34.303 に答える