2

エラーをキャッチしてクライアントに返すために、「不正な入力例外フィルター」を使用しようとしています。モノレポ全体に websocket と http エンドポイントの両方があり、1 つのアプリケーションに両方があります。

私が抱えている問題は、WS と HTTP に 2 つの個別の例外フィルターを使用したくないということです。これまで、要求またはソケット コンテキストのいずれかを定義する Nestjs に依存して、それを利用し、エラーをwebsocket または http res.send 経由でエラーを返します。

しかし、アプリケーション内に websocket がまったくなく、アダプターが登録されておらず、何もない場合でも、両方が定義されていることがわかります。

例外ハンドラ:

    const req: IRequest = host.switchToHttp().getRequest();
    const res: Response = host.switchToHttp().getResponse();

    const socket: ISocket = host.switchToWs().getClient();
  

    if (req && res) {
     // returning req res
    }

    if (socket) {
      // emitting error on socket

次のいずれかの方法はありますか:

  • これを防ぐ
  • コンテキストから別の値を利用して、エラーを返す場所を知る

ありがとうございました。

4

1 に答える 1

1

注意すべき点は、 には、リクエストに関連する値の配列でExecutionContextあるプロパティがあることです。メソッドは、実際にargsは. 、、およびの真偽をチェックする代わりに、リクエストに応じて、、、またはを返す/のプロパティを使用して、そこからエラー処理ロジックを分離することができます。switch ケースを使用したいのですが、 if ステートメントも機能しますswitchTo*().get*()getArgsByIndex()reqressocketgetType()ArgumentHostExecutionContexthttpwsrpcgraphql

switch (host.getType<ContextType | 'graphql'>()) {
  case 'http':
    return this.handleHttpError(exception, host);
  case 'graphql':
    return this.handleGqlError(exception, host);
  case 'ws':
    return this.handleWsError(exception, host);
  case 'rpc':
    return this.handleRpcError(exception, host);
}

代わりにを使用して、ロギング用のインターセプターにたようなものがありますが、考え方は同じである必要があります。ExecutionContext にはandメソッドしかありませんExecutionContextArgumentHostgetClassgetHandler

于 2021-04-14T16:17:59.277 に答える