2014-10-06 3 views
5

मेरा लक्ष्य अनुक्रमणिका पोस्ट के लिए मार्ग बनाना है। उपयोगकर्ता कुछ क्वेरी पैराम (यानी टैग, प्रकार) निर्दिष्ट करने में सक्षम होना चाहिए लेकिन दूसरों को निर्दिष्ट करने में सक्षम नहीं होना चाहिए। स्पष्ट करने के लिए:हैपिज और जोई: उपस्थिति के साथ क्वेरी पैराम मान्य करें: 'वर्जित'

यह ठीक है:

/posts 
/posts?tags=food 
/posts?type=regular&tags=stackoverflow 

यह ठीक नहीं है:

/posts?title=Hello 

यह वह जगह है HAPI पैक config:

servers: [ 
     { 
      host: 'localhost', 
      port: 3000, 
      options: { 
       labels: ["api"], 
       validation: { 
        abortEarly: false, 
        presence: 'forbidden' 
       } 
      } 
     } 
    ], 

presence: forbidden विकल्प नोटिस करें।

handler: function (request, reply) { 
    Post.find(request.query, function (err, posts) { 
     if(err) { 
      console.log(err); 
     } 

     reply(posts); 
    }); 
}, 
validate: { 
    query: { 
     type: Joi.string().optional(), 
     tags: Joi.string().optional() 
    } 

} 

मेरा विचार था कि मान्यता type और tags पैरामीटर (खाली क्वेरी सहित) में से किसी सबसेट की अनुमति चाहिए:

इस मार्ग config है। हालांकि, किसी भी अनुरोध के अनुरोध के बाद मुझे निम्नलिखित त्रुटि मिल रही है:

{ 
    "statusCode": 400, 
    "error": "Bad Request", 
    "message": "value is not allowed", 
    "validation": { 
     "source": "query", 
     "keys": [ 
      "value" 
     ] 
    } 
} 

वह क्यों है? निश्चित रूप से value नाम की कोई कुंजी नहीं है। प्रमाणीकरण को जिस तरह से मैं चाहता हूं उससे व्यवहार कैसे करें?

उत्तर

8

यदि आप एक गैर-प्रकार की स्कीमा ऑब्जेक्ट को परिभाषित करते हैं, तो जोई इसे आंतरिक रूप से object() प्रकार में परिवर्तित करता है। तो यह स्कीमा:

var schema = { 
    type: Joi.string().optional(), 
    tags: Joi.string().optional() 
}; 

हो जाता है:

var schema = Joi.object().keys({ 
    type: Joi.string().optional(), 
    tags: Joi.string().optional() 
}); 

क्योंकि आप सर्वर सेटिंग्स में forbidden को presence निर्धारित करते हैं, यह ऑब्जेक्ट प्रकार के लिए लागू किया जाता है, इसलिए स्कीमा हो जाता है:

var schema = Joi.object().forbidden().keys({ 
    type: Joi.string().optional(), 
    tags: Joi.string().optional() 
}); 

जैसा कि आप देख सकते हैं कि यह मुख्य वस्तु को वर्जित के रूप में चिह्नित करता है जो undefined को छोड़कर किसी भी मूल्य की अनुमति नहीं देगा:

var Joi = require('joi'); 

var schema = Joi.object().forbidden().keys({ 
    type: Joi.string().optional(), 
    tags: Joi.string().optional() 
}); 

var value = {}; 

Joi.validate(value, schema, { presence: 'forbidden' }, function (err, value) { 

    console.log(err); 
}); 

यह आउटपुट:

{ [ValidationError: value is not allowed] 
    name: 'ValidationError', 
    details: 
    [ { message: 'value is not allowed', 
     path: 'value', 
     type: 'any.unknown' } ], 
    _object: {}, 
    annotate: [Function] } 

तो क्या आपको बस इतना करना मुख्य उद्देश्य या तो required या optional चिह्नित करने के लिए forbidden ओवरराइड करने के लिए है:

validate: { 
    query: Joi.object().required().keys({ 
     type: Joi.string().optional(), 
     tags: Joi.string().optional() 
    }) 
} 
+0

धन्यवाद! इस जवाब ने मेरे कुछ अन्य प्रश्नों को भी मंजूरी दे दी। ऐसा लगता है कि मैं वास्तव में वैश्विक सेटिंग के रूप में क्या चाहता था उपस्थिति: 'आवश्यक'। मुझे एहसास नहीं हुआ कि 'वर्जित' सेटिंग सख्त थी। – zir

संबंधित मुद्दे