2017-03-24 13 views
5

Joiを使用して、hapijsフレームワークを使用しているnode.jsサーバーのサービスのペイロードを検証しています。それは(私のtypescriptですコードならびにJavaScriptにコンパイルした後)、このように見えるように使用:検証のデフォルト値を設定する

payload: { 
    para1: Joi.number().required(), 
    para2: Joi.string() 
} 

は今、私は2つのパラメータのデフォルト値を設定したいです。コードはJavaScriptで書かれている場合、私はこれを行うことができます。

payload: { 
    para1: Joi.number().required().default(1), 
    para2: Joi.string().default("defaultstring") 
} 

は私が闊歩してそれをテストし、デフォルト値は、実際に私が設定した値となりました。

しかし、私のプロジェクトはtypescriptで書かれています。私は同じことを行い、タイスクリプトコードをコンパイルしました。結果のjavascriptは次のようになります。

payload: { 
    para1: Joi.number().required()["default"](1), 
    para2: Joi.string()["default"]("defaultstring") 
} 

スワッガーでは、デフォルト値は適用されません。ここで

私の質問です:

  1. コードをコンパイルした後異なってくるのはなぜ?
  2. ["default"]("defaultstring")とは何ですか?それは何ですか?
  3. は、どのように私はそれが@のRSPのポストによるとJoi.string().default("defaultstring")

として

更新をコンパイルできることを確認しtypescriptですコードを書くことができ、問題2のフォーマットは、オブジェクトのプロパティにアクセスするだけで、別の方法です。私はまたhereからの参照を得る。しかし、彼らは何か違いがあるかどうかは説明しません。誰にも分かりますか?アップデート2

Here

はJSプロパティにアクセスする二つの方法の違いです。大括弧を使っても効果はないようです。しかし、私の場合は、デフォルト値はスワッガーに反映されません。それについての研究をしていきます。 JavaScriptで

+0

最後にそれを理解しました。 typescriptを使用すると、スガッサーノートはJSファイルではなく、typescriptの初期関数から生成されます。コード自体に問題はありません。 – zhangjinzhou

答えて

2

この:

object["propertyName"] 

か::

object.propertyName 
あなたはのいずれかとして、オブジェクトのプロパティにアクセスすることができますので、

required()["default"](1) 

required().default(1) 

はこれと同じです

(2番目のケースでは一定の制限があります)。

これは、TypeScriptが長いスタイルを出力する必要がない場合は奇妙ですが、長いスタイルが短いスタイルとまったく同じには動作しないということも奇妙です。

コンパイルされたJavaScriptを短いバージョンに手動で変更して、それが役立つかどうかを確認します。それがなければ問題はどこか他の場所にあります。私の疑惑は、それが助けにならないということです。

.default()それは@types/joiで定義されているので、活字体で動作するはずです - 参照:

  • https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/joi/index.d.ts#L272-L273
  • しかし一方で

    +0

    答えをありがとう。 JS内のオブジェクトにアクセスするもう1つの方法があることを知っておくとよいでしょう。コンパイルされたJavaScriptを変更することは、問題を処理するための持続可能な方法ではないため、おそらく私はあなたに解決策をとることはできません。私は、ソフトウェアを開発するときにgulpを使用します。したがって、私が何かを変更するたびに、すべてのファイルが再コンパイルされます。 – zhangjinzhou

    +0

    <あなたのエディションに基づいて> @ types/joiがうまく開発されていない場合、なぜそれがもっと長いスタイルのJSとしてコンパイルされたのですか? – zhangjinzhou

    0

    使用します(デフォルトを使用する必要があります)コードの下で好き:

    validate: { 
         payload: { 
          para1: Joi.number().integer().min(1).max(100).default(10).required(), 
          para2: Joi.string().min(1).max(100).default("TEST").required(), 
         } 
        } 
    
    +0

    違いは何ですか?私はそれが私のコードと同じように振る舞うと思う。 – zhangjinzhou

    +0

    何も違うが、上記のコードは整形され、完全なブロックである。 –

    +0

    ありがとうございます!これを覚えておいてください。 – zhangjinzhou

    関連する問題