2015-01-02 11 views
5

के अनुसार JSON ऑब्जेक्ट्स को फ़िल्टर करने के लिए कैसे करें मैं node.js और express/koa के साथ एक विश्वसनीय एपीआई बनाता हूं।"स्कीमा"

मैं जेएसओएन डेटा इनपुट फ़िल्टर करना चाहता हूं - सुरक्षा कारणों के साथ-साथ केवल आवश्यक व्यावसायिक विशिष्ट गुणों के लिए। व्यापार-विशिष्ट सत्यापन को फ़िल्टर करने के बाद होता है।

मैं अवांछित JSON/JS ऑब्जेक्ट गुणों को कैसे फेंक सकता हूं - यानी मेरे डेटाबेस स्कीमा के साथ-साथ खाली गुणों में गुण नहीं?

  • इस योजना के अनुसार स्कीमा & परिभाषित करें? उदाहरण का प्रयोग करना https://github.com/alank64/json-schema-filter
  • कोई कॉन्फ़िगर करने योग्य फ़िल्टरिंग उपलब्ध है?

उत्तर

4

मुझे लगता है कि joi सत्यापन और सामान्यीकरण के लिए एक अच्छी पुस्तकालय है। आप कभी-कभी लॉनाश/अंडरस्कोर से _.pick जितना सरल हो सकते हैं।

1

प्रलेखन से, joi.validate() फ़ील्ड को तोड़ सकता है, लेकिन केवल ऑब्जेक्ट्स फ़ील्ड। मैंने यह लिखा है, gist में उपलब्ध है, जो ठीक काम करता प्रतीत होता है।

// Recursively strip out fields in objects and subobjects 
function stripFields(schema, obj) { 
    var newObj = {}; 

    var schemaType = schema.constructor.name; 
    var objType = obj.constructor.name; 

    // If types match and this property is not an Object, return the value 
    if (schemaType !== "Object") { 
    if(schemaType === objType) { 
     return obj; 
    } else { 
     return null; 
    } 
    } 

    var keys = Object.keys(schema); 
    keys.forEach(function(key) { 
    if(key in obj) { 
     // Get instance names for properties 
     var schemaConstructor = schema[key].constructor.name; 
     var objConstructor = obj[key].constructor.name; 

     // Only copy fields with matching types. 
     if (schemaConstructor === objConstructor) { 
     // Handle cases with subObjects 
     if (objConstructor === "Object") { 
      var res = stripFields(schema[key], obj[key]); 
      if (res !== null) { 
      newObj[key] = res; 
      } 
     } else { 
      // Just copy in non-Object properties (String, Boolean, etc.) 
      newObj[key] = obj[key]; 
     } 
     } 
    }; 
    if (newObj === {}) { 
     return null; 
    } 
    }); 
    return newObj; 
} 

निम्नलिखित परीक्षण मामलों को ठीक से गलत क्षेत्रों को निकाल देते हैं:

var stripFields = require("./stripfields"); 

var schema = { 
    a: 1, 
    b: 1, 
    c:{ 
     foo:"bar", 
     obj:{nestedField:1} 
    }, 
    d:[1] 
}; 

var testObj1 = { 
    a: 7, 
    b: 8, 
    c:{ 
     foo:"bar" 
    }, 
    d:[4,5] 
}; 

var testObj2 = { 
    a: 1, 
    b: 2, 
    c:{ 
     foo:"bar", 
     obj:{nestedField:213} 
    }, 
    d:[1,3,4], 
    e:"someOtherField" 
}; 

var testObj3 = { 
    a: 1, 
    c:{ 
     foo:"some string", 
     bar:1 
    }, 
    d:"string instead of array" 
}; 


var res1 = stripFields(schema, testObj1); 
var res2 = stripFields(schema, testObj2); 
var res3 = stripFields(schema, testObj3); 
var res4 = stripFields([1,2,3], ["a"]); 

console.log("Results:"); 
console.log(res1); 
console.log(res2); 
console.log(res3); 
console.log(res4); 
यह तुलना वस्तु में केवल उन्हीं क्षेत्रों जो एक ही नाम और स्कीमा ऑब्जेक्ट में इसी क्षेत्र के रूप में प्रकार वाली एक नई वस्तु रिटर्न

परिणाम:

Results: 
{ a: 7, b: 8, c: { foo: 'bar' }, d: [ 4, 5 ] } 
{ a: 1, 
    b: 2, 
    c: { foo: 'bar', obj: { nestedField: 213 } }, 
    d: [ 1, 3, 4 ] } 
{ a: 1, c: { foo: 'some string' } } 
[ 'a' ]