エクスプレスエラー処理


エラー処理は、どのようにExpressが同期と非同期で発生するエラーをキャッチして処理するかを示します.エラー処理はしばしば注意と優先順位付けを受けることはありません.しかし、それが重要であるのを覚えておくことは重要です、あなたのユーザーインターフェースにあなたのユーザーが保存するのを助けたすべての秒を上書きするためにあなたのユーザーインターフェースの1つの未処理のエラー漏れです.成功した、機能しているWebアプリケーションに関係する多くのコンポーネントがあります、すべての可能なエラーと例外を準備することによって、アプリケーションを馬鹿にすることは重要です.では始めましょう.

概要
エラーは2つのタイプに分けられることができます-操作とプログラミングエラー.プログラミングエラーは、開発者コードから発生するバグですが、一方では、操作エラーは、必然的にユーザーが我々のWebアプリケーションと対話するときに発生します.無効なパスが含まれている場合があります.我々は、グローバルカスタムエラー処理ミドルウェアを作成することによって、これらのエラーを事前に準備する必要があります.

エラーミドルウェア
Expressのミドルウェア機能は、サーバーが要求を受け取り、レスポンスがクライアントに対して発火する前に再生されます.リクエストとレスポンスオブジェクトにアクセスできます.データ処理、データベース問い合わせ、API呼び出しの作成、応答の送信、次のミドルウェア関数( Next ()関数を使用して)を呼び出すことができます.
  • リクエストパスが定義されたルートと一致しない単純な例を見ましょう.
    < div >
    あなたが'/'以外のルートを訪問しようとするならばhttps://error-handling.adidoshi.repl.co/user , エラーが表示されます-
  • < ull >
    クラスをハイライト表示する
    {"status": 404, "error": "Not found"}
    
    < div >
    それ以外の場合にエラーが扱われなければ、< tt/p >のようなプレーンHTMLになります
    < P >


    < H 3 >

    エラークラスの作成-
    <高橋潤子>
    共通の練習は初期のエラーオブジェクトを取り、それ自身のクラスで展開することですbr/>
    <> P >
    クラスをハイライト表示する
    class ErrorHandler extends Error {
      constructor(message, statusCode) {
        super(message);
        this.statusCode = statusCode;
        this.status = `${statusCode}`.startsWith("4") ? "fail" : "error";
        Error.captureStackTrace(this, this.constructor);
      }
    }
    
    < div >
    SUP ()関数は引数を最初に引数として受け取ります.次に、StatusCodeプロパティとStatusCodeから派生したステータスを追加します.最後に、CaptureRecackTrace行は、スタックのトレースでこのクラスが表示されないようにします.これは、コードのエラーが発生した場所を示すコンソールログの一部です.p >
    <ウル>
  • たとえば、このエラークラスを使用すると、上記のコードを書き換えることができます.
  • < ull >
    クラスをハイライト表示する
    app.use((req, res, next) => {
    next(new ErrorHandler(`Can't find ${req.originalUrl} on this server!`, 404));
    })
    
    < div >
    < H 3 >

    非同期関数におけるエラーの捕捉
    <高橋潤子>
    主にAPIを開発している間、我々はデータベースクエリのためにAsync関数を書いて、応答を送りに来ます.今まで、私たちは非同期/wait関数のエラーをキャッチするtry/catchブロックを使いました
    <> P >
    クラスをハイライト表示する
    const createPost = async (req, res) => {
        const { desc, location, pic } = req.body;
      try {
        if (!desc || !pic || !location) {
            res.status(400).json('Please fill all the details')
          } else {
            const newPost = new Post({
              user: req.user._id,
              desc,
              location,
              img: pic,
            });
            const createdPost = await newPost.save();
            res.status(201).json(createdPost);
          }
      } catch (error) {
          next(error)
        }
      }
    
    < div >
    しかし、彼らは我々のコードを乱雑に見えさせます.あなたのノードJSアプリケーションでキャッチしようとする最善の方法は、関数コールを高次関数にラップすることですbr/>
    <> P >
    クラスをハイライト表示する
    const catchAsync = fn => {
      return (req, res, next) => {
        fn(req, res, next).catch(next);
      };
    };
    
    < div >
    これは関数catchasyncです、そこで、私は我々のExpress関数から標準として渡される3つのParametes Req、RES、次のオブジェクトを渡しています、ここでは、我々が我々のFunc呼び出しを約束と包みに包むことを意味します次はチェーンの次の関数に渡します.p >
    <ウル>
  • 上記のcreatepost関数をラップしましょう
  • < ull >
    クラスをハイライト表示する
    const createPost = catchAsync(async (req, res, next) => {
      const { desc, location, pic } = req.body;
      if (!desc || !pic || !location) {
        return next(new ErrorHandler("Fill all the details", 400));
      } else {
        const newPost = new Post({
          user: req.user._id,
          desc,
          location,
          img: pic,
        });
        const createdPost = await newPost.save();
        res.status(201).json(createdPost);
      }
    });
    
    < div >
    < wbr >最後に、私たちはtry/catchを取り除きます.現在、このcatchasyncの中でラップするどんなルート機能でも、自動的にエラーを捕えます.注:NPMパッケージもありますexpress-async-handler どのような方法で動作します我々のルート機能を包むことができる内部で、しかし、ものが場面の後で働く方法を理解することは、我々を大いに助けますp >
    < H 3 >

    生産対開発エラー
    <高橋潤子>
    < p >ユーザにわかりやすく、クリーンなエラーメッセージを送りたい.しかし、我々はできるだけ多くの情報を開発します.環境変数にアクセスし、それに応じて応答を返します.
    <ウル>
  • スタックトレース-プログラムの実行中に特定のインスタンスでアクティブなスタックフレームをトレースするために使用されます.エラーが発生した正確な点を示すように、コードのデバッグ中にスタックトレースが有用です
  • < ull >
    クラスをハイライト表示する
    const sendErrorDev = (err, res) => {
      res.status(err.statusCode).json({
        status: err.status,
        message: err.message,
        stack: err.stack,
      });
    };
    const sendErrorProd = (err, res) => {
      res.status(err.statusCode).json({
        status: err.status,
        message: err.message,
      });
    };
    module.exports = (err, req, res, next) => {
      err.statusCode = err.statusCode || 500;
      err.message = err.message || "Internal Server Error";
    
      if (process.env.NODE_ENV === "development") {
        sendErrorDev(err, res);
      } else if (process.env.NODE_ENV === "production") {
        sendErrorProd(err, res);
      }
    };
    
    < div >
    < p >主な関数コードを説明するために、errは言います.StatusCodeサーバが発生したエラーであるかどうかを指定します.p >
    <ウル>
  • また、モデルプロパティのチェックを行う場合に有用なマングースエラーを扱うこともできます.
    マングースのエラーを含めることができます
  • < ull >
    クラスをハイライト表示する
      if (err.code === 11000) {
        const message = `Duplicate ${Object.keys(err.keyValue)} entered`;
        err = new ErrorHandler(message, 400);
      }
    
    < div >
    <ウル>
  • 一般的に、明示的API APIを作成するとき、我々は開発者としての良い実行であるモデル- View - Controller(MVCデザインパターン)と呼ばれる特定の構造にコードを分割します.これによりミドルウェアもあります.
  • < ull >
    それは、このポストを読んで希望は、NodeJs&の適切なエラー処理の実践を理解したあなたの今後のプロジェクトでそれを試してください.ご訪問ありがとうございます!p >