2

こんにちは、Postgresql を初めて使用するので、エラーがスローされたときに 0 の結果を処理する方法を学びたいと思いました。基本的に、ユーザーが存在しない場合はユーザーを取得し、存在しない場合は null を返し、エラーハンドラーが必要です。以下は、私が使用している現在のコードです。これを行うためのより良い方法に関するヒントは大歓迎です!

var options = {
  // Initialization Options
  promiseLib: promise
};
var pgp = require('pg-promise')(options);
var connectionString = 'postgres://localhost:5432/myDbName';
var db = pgp(connectionString);

function getUser(id) {         
  let user = new Promise(function(resolve, reject) {
    try {
      db.one('select * from users where loginName = $1', id).then(function(data) {
        console.log(data);
        resolve(data); 
      }).catch (function (e) {
        console.log('error: '+e);
        reject(e);
      });
    }
    catch (e) {
      console.log('error: '+e);
      reject(e);
    }
  });
  return user;
}

コンソールでの出力:

error: QueryResultError {
    code: queryResultErrorCode.noData
    message: "No data returned from the query."
    received: 0
    query: "select * from users where loginName = 'someUserName'"
}
4

2 に答える 2

9

私はpg-promiseの作者です。


promise の領域では、.thenすべての通常の状況.catchを処理し、すべてのエラー状況を処理するために使用します。

そのルールに準拠したpg-promiseに変換すると、すべての通常の状況を表す結果で解決するデータベース メソッドを実行するため、それ以外は.catch.

たとえば、クエリで 1 行または 1 行も返さないことが通常の状況である場合は、メソッドoneOrNoneを使用する必要があります。方法oneを使用するのは、行を返さないことが無効な状況である場合のみです。

API に従って、メソッドoneOrNoneは、データ行が見つかったnull場合、または行が見つからなかった場合に解決されます。これを次に確認できます。

db.oneOrNone('select * from users where loginName = $1', id)
    .then(user=> {
        if (user) {
            // user found
        } else {
            // user not found
        }
    })
    .catch(error=> {
        // something went wrong;     
    });

ただし、データを返さないことがエラーを表すクエリがある場合、行を返さないことを確認する適切な方法は次のようになります。

var QRE = pgp.errors.QueryResultError;
var qrec = pgp.errors.queryResultErrorCode;

db.one('select * from users where loginName = $1', id)
    .then(user=> {
        // normal situation;
    })
    .catch(error=> {
        if (error instanceof QRE && error.code === qrec.noData) {
            // found no row
        } else {
            // something else is wrong;
        }
    });

manyメソッドと manyOrNoneメソッドを選択する場合も同様の考慮事項があります(メソッドanyはmanyOrNoneの短いエイリアスです)

タイプQueryResultErrorには、ライブラリ内の他のすべてのタイプと同様に、非常に分かりやすいコンソール出力があり、状況を処理する方法の良いアイデアを提供します。

于 2016-10-04T08:16:12.007 に答える
1

クエリの catch ハンドラーで、そのエラーをテストするだけです。ソース コードを見るとpg-promise、noData のコードは 0 です。次のようにします。

db.one('select * from users where loginName = $1', id).then(function(data) {
        console.log(data);
        resolve(data); 
      }).catch (function (e) {
        if(e.code === 0){
          resolve(null);
        }
        console.log('error: '+e);
        reject(e);
      });
于 2016-10-04T03:07:37.527 に答える