8

NodeJS と pg-promise を PostgreSQL バックエンドで実行しています。場合によっては例外をスローする独自の TRIGGER を作成しました。これで問題なく動作します。

しかし、pg-promise を使用すると、エラーの名前を把握するのに苦労します。

このコードの使用:

...
.catch(function(err) {
    console.log(err);
});

次の出力が得られます。

[ { success: false,
result: 
 { [error: vote_limit_exceeded]
   name: 'error',
   length: 80,
   severity: 'ERROR',
   code: 'P0001',
   detail: undefined,
   hint: undefined,
   position: undefined,
   internalPosition: undefined,
   internalQuery: undefined,
   where: undefined,
   schema: undefined,
   table: undefined,
   column: undefined,
   dataType: undefined,
   constraint: undefined,
   file: 'pl_exec.c',
   line: '3068',
   routine: 'exec_stmt_raise' } } ]

コンテキストに「vote_limit_exceeded」という名前が表示されますが、テキスト文字列として返すにはどうすればよいですか?

私は「近づく」ことを試みました:

console.log(err[0].result);

しかし、「vote_limit_exceeded」を分離することはできません。

4

1 に答える 1

8

これは、目に見えないプロパティを持つ PostgreSQL による標準エラー プレゼンテーションであるmessageため、呼び出すerror.messageと期待どおりの結果が得られます。

次のようにエラーをログに記録することをお勧めします。

console.log(error.message || error);

コード例を拡張しています...

エラーコンテキストは、バッチ関数を呼び出した結果に由来するようです。つまり、そのようなコンテキストではerror.getErrors()[0]、最初に見つかったエラーを取得するために呼び出すこともできます。

したがって、特定のケースでは、安全なエラーログは次のようになります。

.catch(error => {
    if (Array.isArray(error) && 'getErrors' in error) {
        // the error came from method `batch`;
        // let's log the very first error:
        error = error.getErrors()[0];
    }
    console.log("ERROR:", error.message || error);
});

もちろん、代わりにメソッドbatchによって返されるすべてのエラーをログに記録するように簡単に変更できます。

この質問によりmessage、拒否結果にプロパティを追加することについてのアイデアが得られました。常に改善の余地があります;)

アップデート

これに続いて、 spex.batch reject の実装を更新してプロパティfirstとをサポートしmessage、エラー処理を容易にし、バージョン0.4.3としてリリースしました。と の両方がネストされたバッチ結果firstをサポートしているため、実装は最初に意図したよりもさらに優れています。message

バージョン 4.1.10 (またはそれ以降) に更新pg-promiseすると、そのようなエラーを一般的な方法でログに記録できます。

.catch(error => {
    console.log("ERROR:", error.message || error);
});

エラーがネストされたバッチ呼び出しから発生した場合でも、常に正しいエラー メッセージがログに記録されます。

于 2016-05-16T10:05:13.007 に答える