2016-03-19 15 views
1

私はクライアント側からポストを得るたびに、サーバー側としてjavascript nodejsを使用して、データを検証し、各キー/値のデータ構造が存在することを確認します。私は(..)場合は、1つに、各レベルを入れて、それは長いとハードですので、JSON/JavaScriptのオブジェクトのような行を変更することはできませんので、私は疑問に思うポストjsonデータサーバー側を確認する

これを行うには、任意のより良いアイデアは、
多分ずっと読めるあり維持する。

通常、これを行う方法は?
正しいjsonオブジェクト構造を作成し、ポストデータと比較しますか?

ようにする必要があります任意の提案が

正しいデータを認めるようになります。

request.data = { 
    "user": { 
    "status": "int", 
    "role": { 
     "role": "int" 
    }, 
    "information": { 
     "email": "text", 
     "password": "text", 
     "username": "text", 
     "country": "text", 
     ... a lot .... 
    } 
    }, 
} 

サーバ側、私は正しいJSONを設定しよう

var validateRequest = 'true'; 
    if (typeof request.data.user == 'undefined') { 
     validateRequest = 'false'; 
    } else { 
     if (typeof request.data.user.status == 'undefined' || typeof request.data.user.role == 'undefined' || typeof request.data.user.information == 'undefined') { 
     validateRequest = 'false'; 
     } else { 
     if (typeof request.data.user.role == 'undefined' || typeof request.data.user.information.email == 'undefined' ...) { 
      validateRequest = 'false'; 
     } 
     } 
    } 

    if (validateRequest != 'false') { 
     // validate data type 

     // use data crud 

    } 

更新

を検証サーバー内の構造側、およびポストと比較し、 は、私はいくつかのJSON差分moduleを見つけましたが、あなたは、要求の構造の違いを観察するjsondiffpatchモジュールを利用することができる唯一のキー

var a = { 
    "information": { 
    "email": "text", 
    "password": "text" 
    } 
} 

var b = { 
    "information": { 
    // "email": "text", 
    "password": "text" 
    } 
} 
console.log(jsondiffpatch.diff(a, b)); 
I only know if data not different will get undefined 
if b remove "email" 
get this in console ?? ¨ information: ¨ email: ÿ 'text', 0, 0 ¦ ¼ ¼ 
if b email val = textt 
get this information: ¨ email: ÿ 'text', 'textt' ¦ ¼ ¼ 
+0

反復を設定$を確認してください動作します。 – mehulmpt

+1

ライブラリを使用することができれば、私は[joi](https://github.com/hapijs/joi)がオブジェクト検証のために働くことができます。 – wolfemm

+0

@wolfemmはとてもクールだと私は今試してみるよ – user1575921

答えて

0

を比較使用状況を修正する方法を見つけることができません。

jsondiffpatchモジュールからdiff機能を入手するには、次の要求を検証するために

var diff = require('jsondiffpatch').diff; 

、テンプレートにリクエストを比較することができます。両者の違いを見つけ、テンプレートへの要求を比較するために

var requestTemplate = { 
    "user": { 
    "status": "int", 
    "role": { 
     "role": "int" 
    }, 
    "information": { 
     "email": "text", 
     "password": "text", 
     "username": "text", 
     "country": "text", 
     ... a lot .... 
    } 
    }, 
} 

:例えば、テンプレートは次のように定義され

var delta = diff(request.data, requestTemplate); 

この署名の値を持つプロパティのデルタ検索します:

'email': ['text', 0, 0] 

このシグネチャは、プロパティが削除されたことを示します。たとえば、上記の値はrequest.dataオブジェクトにemailプロパティがないことを示します。このプロパティがないと、要求が無効であることを意味します。

あなたはそうのような検証を実行するための関数を定義することができます。私は道を見つける、
は私が見つけ、キー異なるまたは値別の私の質問で使用jsondiffpatch後に結果を決定することはできません

function validateRequest(template, requestData) { 
    var delta = diff(requestData, template); 

    // Search the delta for a deleted property. If found, invalidate the request. 
    // If there is any key whose value looks like this: 
    // 'email': ['text', 0, 0] 
    // it means that the key has been removed and the request is invalid 
} 
+0

返信いただきありがとうございます。私はログで見ることができますが、比較後の結果を検証する方法は? – user1575921

+1

...これは問題で同じように見える、私の問題は、キーが異なるか、JavaScriptの値が異なるかを判断できない。あなたのコメント部分 '//削除されたプロパティのデルタを検索します。見つかった場合は、リクエストを無効にしてください。 ' – user1575921

1

別のモジュールhttps://github.com/mirek/node-rus-diffはそれだけで解除$またはループを使用してJSONオブジェクトの上

var diff = require('rus-diff').diff; 

var result = diff(a, b); 

if (typeof result.$unset != 'undefined') { 
    console.log('different key'); 
} 
+1

これは、私が提供したものよりはるかに良い解決策です。 – gnerkus

関連する問題