Egg.jsにおけるパラメータの検証

6490 ワード

Egg.jsにおけるパラメータの検証
日常の作業ではGET/POSTの入参を頻繁に処理することは避けられません.もちろん、actionごとに繰り返し行うことができます.
  • queryまたはbodyからパラメータを取り出し、
  • オプションの入参を空にし、
  • は、パラメータのタイプ変換を処理し、
  • 入力パラメータの論理チェック、数値が限界を超えたかどうか、タイプが不正かどうかなど...
  • しかし、これらの一般的な論理は、プラグインまたはサービスに抽出することによって、コードの冗長性と重複労働を回避することができる.egg-validation Egg.jsでは、egg-validationプラグインを使用して、この部分の作業量を削減できます.このプラグインでは、上記のほとんどの作業を簡単な構成に変更できます.プラグインのインストール
    $ yarn add egg-validate
    プラグイン有効化の構成:config/plugin.ts
    const plugin: EggPlugin = {
        // ...
        validate: {
            enable: true,
            package: 'egg-validate',
        },
        // ...
    };
    
    export default plugin;
    プラグインの構成:config/config.default.ts
    export default (appInfo: EggAppInfo) => {
      const config = {} as PowerPartial<EggAppConfig>;
    
      // ...
      config.validate = {
        convert: true,
        widelyUndefined:true
      };
    
      // ...
    };
    その構成項目はnode-modules/parameterのすべての使用可能な構成項目であり、このプラグインは実際には後者のEgg.jsパッケージであるためです.
  • convertは、パラメータを変換し、開くことを推奨します.たとえば、フォームのデフォルトのsubmitタイプボタンを使用してフォームをコミットすると、シーケンス化された文字列がコミットされ、数値タイプが期待されるフィールドは常に検証されません.このチェックボックスにチェックマークが付いている場合、入力は希望のタイプに変換されます.
  • widelyUndefinedがオンになると、空の文字列、NaNnullundefinedに変換し、これらの異常なデータを統一し、後続の処理を容易にします.

  • プラグインを使用してappおよびcontextvalidatorオブジェクトを拡張し、validator.validate(rules,data)を呼び出すことで検証します.たとえば、nameという文字列のパラメータを受信します.app/controller/home.ts
    const errors = this.app.validator.validate({ name: 'string' }, this.request.body);
    if (errors) {
        this.ctx.body = errors;
    }
    検証ルールvalidateの最初のパラメータは、オブジェクトであるルールです.各フィールドは、同じ名前のパラメータに対応します.フィールドの値は、単純な文字列、フィールドのタイプ、オブジェクトを指定して、このオブジェクトでより詳細なルール指定を行います.
    const rules = {
        param1: 'string', //         
        param2: 'string?', //         
        param3: {
            type: 'int', //     
            required: false, //      
            min: 0, //        
            max: 10, //        
        },
    };
    ルールのデフォルト入力は必須です.オプションの入力については、タイプの後に疑問符を付けることで、Type Scriptと同様にrequired: falseを明示的に指定することもできます.プリセットで使用可能なパラメータタイプはparameterを参照してください.パラメータのルール構成については、パラメータのタイプに応じて、数値タイプなど、異なる構成トップがあり、その最大最小値を構成することができます.列挙については、その候補値を定義できます.これらの値に含まれないと、検証は通過しません.各タイプで使用可能な構成項目はparameterを参照してください.カスタム検証ルールは、上記のドキュメントに予め設定されているこれらのタイプが要件を満たすことができない場合、validator.addRule(type,checker)カスタムルールで拡張できます.ここで、typeは新規ルールのタイプ名であり、checkerは検証のための正則または方法である.メソッドの場合、そのパラメータはルール自体と検証が必要なデータであり、ドキュメントにはパラメータが表示されていません.ソースコードを参照してください.
    checker.call(self, rule, obj[key], obj);
    例えば、jsonStringのタイプの検証ルールを追加し、パラメータを限定するには合法的なJSONデータが必要である.app.ts
    export default (app) => {
        app.validator.addRule('jsonString', (_rule, value) => {
            try {
                JSON.parse(value);
            } catch (err) {
                return 'must be json string';
            }
        });
    };
    サンプル・コードデバッグをローカルで実行でき、事前に設定された検証ルールとカスタム・ルールの例を組み合わせて、GitHubで完全なコードを見つけることができます.結論:重複したコードを書きすぎた後、例えばこのようなパラメータの検証は、自分で車輪を作っても、車輪を探しても、これらの重複した仕事をどのように優雅に処理するかを考えるべきだ.パラメータの検証はこのようによく見られ、さらに、ブラウザ側のJavaScriptとNode.jsの論理を統一する前バックグラウンドで通用する検証論理を追求することもできます.関連リソース
  • egg-validate
  • node-modules/parameter