Expressとノードによるデータの検証.js


Github repository
このチュートリアルでは、どのように、なぜ私たちはAPIに到着しているデータを検証する必要が学びます.データの検証は、タスクが情報を収集し、データを分析し、プレゼンテーションのためのデータを準備し、他の多くのユースケースかどうかのアプリケーションの重要な部分です.不必要なデータがアプリケーションを通してさらにドラッグされるならば、それが我々が正確でないデータを持っていることが起こることができるので、始めから入って来るデータを確かめることは重要です.
データの検証は、どんなデータワークフローにおいても重要で重要なステップですが、残念ながら、しばしばスキップされます.データ検証はより多くの時間を必要とします、そして、したがって、それは仕事を遅くします、しかし、それが我々がよりきれいなデータ流れをつくるのを援助するので、それはesentialです.
今日では、データの検証は、多くのライブラリのおかげで実装を容易になっている.そこに多くのライブラリがありますが、私はそれらのいくつかだけを記述します.
ちょうどその言及NestJS , スケーラブルなノードを構築するための一般的なフレームワークです.JSアプリケーションでは、クラスバリデータを使用します.Moleculer サーバー側アプリケーションを構築するための別のフレームワークであり、既定のバリデータとして高速バリデータを使用しています.
いくつかのバリデータがデコレータ(Class Validator)を追加することによってクラスを使用して動作する間、いくつかのバリデータがオブジェクトのJSONスキーマ(JOI、Fastバリデータ)で動作することが重要です.
クラスとJSONオブジェクトを別々に書く必要がないので、クラススクリプト言語を使用してクラスベースのバリデータを使用する方が良いと思いますが、デコレータを追加することで既存のクラスを使用できます.これはクラスバリデータの場合です.

モデリング


ノートを作成する簡単なモデルを作成します.
export class Note {
  _id: string;

  title: string;
  body: string;

  authorId: string;

  createdAt: string;
  updatedAt: string;
}
マングース用コード.
import { model, Model, Schema } from 'mongoose';
import { Note } from './note.model';

const NoteSchema = new Schema<Note>(
  {
    _id: { type: String, required: true },

    title: { type: String, required: true },
    body: { type: String, required: true },

    authorId: { type: String, required: true },
  },
  { collection: 'note', timestamps: true }
);

export const NoteModel: Model<Note> = model('note', NoteSchema);
クラスバリデータライブラリをインストールし、tsconfigで実験的な装飾子を追加する必要があります.JSONファイル
npm install --save class-validator
{
  "compilerOptions": {
    "experimentalDecorators": true, // <- add this
    "target": "es5",
    "module": "commonjs",
    "outDir": "./dist",
    "rootDir": "./",
    "baseUrl": "./",
    "paths": {},
    "esModuleInterop": true
  }
}

今、私たちは検証のためのモデルを作成することができます、そして、我々が下記のコードを見るならば、我々は我々に2、3のモデルがあるのを見ます.
  • Note マングースにはスキーマを作成するための基本モデルです.
  • NoteCreate モデルはMongoDBのデータを作成するために使用されるモデルです.
  • NoteCreateAPI APIに来ると予想するデータである検証モデルです.
  • import { IsString, MaxLength, MinLength } from 'class-validator';
    
    // Actual model.
    export class Note {
      _id: string;
    
      title: string;
      body: string;
    
      authorId: string;
    
      createdAt: string;
      updatedAt: string;
    }
    
    // Model for creating item in database.
    export type NoteCreate = Pick<Note, '_id' | 'title' | 'body' | 'authorId'>;
    
    // Validation model which comes to the API.
    export class NoteCreateAPI implements Pick<Note, 'title' | 'body'> {
      @IsString()
      @MinLength(10)
      @MaxLength(500)
      title: string;
    
      @IsString()
      @MinLength(100)
      @MaxLength(5_000)
      body: string;
    }
    
    我々が見るならばNoteCreateAPI 我々が我々が選んだモデルtitle and body 注意を作成するために必要なプロパティ.我々はプロパティにのみフォーカスしますtitle . 3つの装飾子を追加しました.
  • @isstring () -値は文字列型でなければなりません.
  • @minlength ( 10 )-値は、少なくとも10文字の長さでなければなりません.
  • @maxlength ( 500 )-値は最大500文字でなければなりません.
  • 私はいくつかの基本的なデコレータだけを追加しましたが、どのように我々はそのモデルを見たいという大きな柔軟性があります.私たちのモデルがどのように見えるかについてより多くの、そして、どんなパラメタが含めることができるかについて、我々はライブラリからドキュメンテーションを見ることができます:class-validator documentation .
    ポストAPIメソッドを作成し、そのルートにデータを送信します.
    注:ルートは、以前のチュートリアルのいずれかで作成したAuthMiddlewareで保護されています.
    app.post('/note', authMiddleware, async (req: Request, res: Response, next: NextFunction) => {
      // data from the token that is verified
      const noteNew = new NoteCreateAPI();
      noteNew.title = req.body.title;
      noteNew.body = req.body.body;
    
      // verify input parameters
      const errors = await validate(noteNew);
      if (errors.length) {
        next(new ErrorException(ErrorCode.ValidationError, errors));
      }
    
      // create note data
      const tokenData: { _id: string; email: string } = req.body.tokenData;
      const noteCreate: NoteCreate = {
        _id: ulid(),
        title: noteNew.title,
        body: noteNew.body,
    
        authorId: tokenData._id,
      };
    
      const created = await NoteModel.create(noteCreate);
      res.send(created);
    });
    
    すべてが準備された今、我々は我々が有効でないデータを送るとき、何が起こるかをチェックすることができます、そして、我々が有効であるデータを送るとき.
    我々が見るならばExample 1 その場を見てみようtitle フィールドが不足しているbody は文字の長さが見つからない.

    インExample 2 その畑が見えるtitle が存在するが、文字の長さが満たされていない、フィールドと同じですbody .
    Example 2
    ついにExample 3 両方とも見ることができるtitle and body 要件を満たし、我々は正常にメモを作成している.
    Example 3

    ラッピング


    このチュートリアルでは、アプリケーションでバリデータを持つことが重要である理由を学びました.ノードで使用できるライブラリを簡単に調べました.JSアプリケーション.クラスバリデーションライブラリを選び、失敗した例と成功した検証の例を示すコード実装を作成しました.