1

私のnode.jsアプリケーションでは、ドメインごとにエラーを処理していました。アプリのアーキテクチャは次のようになります。

  1. コントローラー。高速ルーティング呼び出しコントローラー メソッド

  2. コントローラーはサービスを呼び出し、モデルを使用します

  3. サービス呼び出しリポジトリ

(実際には、DDD に非常に似ています)。

したがって、コントローラーはドメインを作成し、そのドメインで実際の本体を実行します。何か問題が発生した場合に例外をスローするために使用されるサービス。また、コントローラはドメイン エラーをリッスンして処理します。すべてのサービスのメソッド呼び出しスタックでエラーが発生することを心配する必要がないため、非常に快適です。例外をスローするだけで、コントローラーでキャッチされることを確認できます。

しかし、PostgreSQL の使用に関連する問題に直面しました。node-postgres モジュールを使用し、個別の js ファイルで pg.Client を作成するため、pg.Client はすべての人に共有されます (それ以外の場合、各クエリで pg.Client を作成すると、postgres とのアクティブな接続が多数開かれます)。

問題は、pg.Client が別ファイルで定義されている場合、グローバル オブジェクトのようになり、コントローラーで作成されたドメイン スコープに含まれないことです。したがって、pg.Client コールバックからスローされた例外は、ドメインによってキャッチされません。

明確にするために、リクエスト処理の簡単な方法を示します。ユーザーが userId でログインしたいとします。

  1. 最初の pg.Client のどこかに作成されました

  2. Get リクエストが Express に来る、Express コール ルーティング メソッド

  3. ルーティングはコントローラーのメソッドの一部を呼び出します

  4. コントローラーはドメインを作成し、«domain.run» サービスを呼び出します

  5. サービスがリポジトリを呼び出す

  6. リポジトリは以前に作成された pg.Client を取得し、SQL クエリ メソッドを呼び出します

  7. SQLクエリメソッドの結果はコールバックに入れられます(したがって、このコールバックはpg.Clientによって呼び出されます)

  8. 次に、コールバックがサービスで処理されます。ここで、ユーザー モデルの代わりに null を取得することを確認し (指定された userId に対して db にそのようなユーザーが存在しないため)、例外をスローします。

したがって、その例外はドメインでキャッチされません。技術的には、ノード ドメインの «add» メソッドを使用して pg.Client を追加する必要がありますが、pg.Client は共有されているため、別の同時ドメインに追加されることになります。

より明確にするために、いくつかのコード例をリストします。UserService の簡略化されたメソッドです。

 login: function (email) {

                    var userRepository = new UserRepository();
                    userRepository.findByEmail(email, function (model) {
                        if (model == null)
                           throw new Error('No such user');
                    });

            }

したがって、そのメソッド «login» はドメインで呼び出されます。しかし、それはuserRepositoryを作成し、ドメインのスコープ外にある共有pg.Clientを使用するfindByEmailメソッドを呼び出します。そのため、ドメインで例外がキャッチされません。

それを修正して pg.Client をドメインに入れる方法はありますか?

4

1 に答える 1