15

मैं अनुरोध और प्रतिक्रिया मॉडल को परिभाषित करना चाहता हूं। मैं एडब्ल्यूएस साथ Serverless फ्रेमवर्क का उपयोग करें और सब कुछ मैं दिखाई दे रही है serverless-aws-documentationसर्वरलेस-aws- प्रलेखन मॉडल परिभाषाएं?

का उपयोग कर README का कहना है कि मैं custom.documentation.models.MODELNAME

schema: ${file(models/error.json)} 

में इस लाइन की आवश्यकता है लेकिन वे models/error.json का एक उदाहरण फ़ाइल नहीं है की सिफारिश की आधार रेखा के रूप में उपयोग करने के लिए।

- 
    name: DoSomethingRequest 
    contentType: "application/json" 
    schema: 
    type: array 
    items: 
     type: string 

यह मैं क्या कर रहा हूँ के लिए पर्याप्त विवरण प्रदान नहीं करता है:

वास्तविक उदाहरण serverless.yml में वे इस तरह की एक परिभाषा है।


मेरा लक्ष्य स्ट्रिंग ऑब्जेक्ट्स, एक संदेश और स्टेटस कोड की सरणी के लिए परिभाषित स्कीमा होना है। संदेश और स्थिति कोड, हालांकि, वैकल्पिक हैं। ये अन्य मॉडलों का हिस्सा भी हो सकता है और यदि संभव हो तो मैं प्रत्येक मॉडल के लिए अपनी परिभाषा दोहराना नहीं चाहता हूं।

मेरे वर्तमान प्रयास है:

- 
    name: ReturnArrayResponse 
    contentType: "application/json" 
    schema: 
    type: array 
    itemsArray: 
     type: string 
    message: 
     type: string 
    statusCode: 
     type: number 

मुझे लगता है यह मैं क्या चाहते करने जा रहा है, लेकिन मैं कैसे message हो सकता है और statusCode वैकल्पिक हो सकता है और मेरे अन्य मॉडल में इन दोनों वस्तुओं को दोहराने?

मैं या तो एक yml समाधान से खुश हूं जो मैं अपने serverless.yml फ़ाइल या एक जेएसएस फ़ाइल में डाल सकता हूं जिसे मैं संदर्भित कर सकता हूं।

उत्तर

4

एक फाइल भी शामिल है

दिए गए उदाहरण में, error.json में कोई वैध स्कीमा हो सकती है। तो यह रूप में सरल कुछ ठीक है:

{ 
    "$schema" : "http://json-schema.org/draft-04/schema#", 
    "title" : "Error Schema", 
    "type" : "object", 
    "properties" : { 
    "message" : { "type" : "string" }, 
    "statusCode": { "type": "number" }, 
    "itemsArray": { 
     "type": "array", 
     "items": { 
      "type": "string" 
     } 
    } 
    } 
} 

यह विशेष रूप से उपयोगी आप मॉडल पहले से ही एडब्ल्यूएस में परिभाषित किया गया है जब है, लेकिन:

{"type":"object","properties":{"message":{"type":"string"}}}

यह भी $schema और title जैसी विशेषताओं को शामिल करने के ठीक है आपके पास उन्हें बनाने के लिए सर्वर रहित yaml नहीं है। आप आसानी से एडब्ल्यूएस कंसोल से स्कीमा की प्रतिलिपि बना सकते हैं, जेसन को एक फाइल में पेस्ट कर सकते हैं और प्रश्न में उल्लिखित schema: ${file()} सिंटैक्स का उपयोग कर सकते हैं। जहां तक ​​मैं कुछ भी बता सकता हूं कि आप स्वीकार करने के लिए एडब्ल्यूएस कंसोल प्राप्त कर सकते हैं।

सूखी

मैं एक तरह से एक serverless फ़ाइल में अन्य मॉडलों के भीतर से मॉडल को संदर्भित करने के बारे में पता नहीं है, लेकिन आप प्लगइन लेखकों के रूप में ही दृष्टिकोण का उपयोग कर सकता है, और कुछ भी डाल आप की जरूरत है models के बाहर पुन: उपयोग करें और कहीं भी इसका पुन: उपयोग करना आसान है। प्लगइन लेखक commonModelSchemaFragments का उपयोग करते हैं।

तो अगर आप तो जैसे कुछ टुकड़े है:

commonModelSchemaFragments: 
    # defining common fragments means you can reference them with a single line 
    StringArrayFragment: 
     type: array 
     items: 
      type: string 
    HttpResponse: 
     type: object 
     properties: 
     message: 
      type: string 
     statusCode: 
      type: number  

आप इस तरह के मॉडल में उन टुकड़ों देख सकते हैं:

- 
    name: HttpStatusResponse 
    contentType: "application/json" 
    schema: 
     type: object 
     properties: 
      serverResponse: 
      ${self:custom.commonModelSchemaFragments.HttpResponse} 
      messageArray: 
      ${self:custom.commonModelSchemaFragments.StringArrayFragment} 

अंकन विशेषताएँ वैकल्पिक

आप ऐसा कर सकते हैं required के रूप में विशेषताओं को चिह्नित करके। बस उन सभी को छोड़कर, जिन्हें आप वैकल्पिक होना चाहते हैं, को छोड़कर सभी विशेषताओं की एक सूची प्रदान करें।

{ 
    "type": "object", 
    "required": ["message"], 
    "properties": { 
     "optionalMessage": { 
      "type": "string" 
     }, 
     "message": { 
      "type": "string" 
     } 
    } 
} 

जो आप अपने serverless फ़ाइल में इस तरह YAML का उपयोग करके निर्माण होगा: अनुरोध सत्यापन

अंकन पर

- 
    name: OptionalResponse 
    contentType: "application/json" 
    schema: 
     type: object 
     required: 
     - "message" 
     properties: 
     message: 
      type: string 
     optionalMessage: 
      type: string 

नोट विशेषताओं required कि के लिए json स्कीमा इस तरह दिखता है या optional केवल तभी महत्वपूर्ण है जब अनुरोध निकाय सत्यापन चालू हो:

Request body validation option in AWS console

मुझे किसी विशेष सर्वर रहित वाक्यविन्यास का उपयोग करके अनुरोध सत्यापन चालू करने का कोई तरीका नहीं पता है। ऐसा लगता है कि आप इसे resources सेक्शन में कर सकते हैं, लेकिन मैंने कोशिश नहीं की है। Source

+0

आप प्लगइन https://www.npmjs.com/package/serverless-reqvalidator-plugin (मैंने इसे लिखा है) का उपयोग कर अनुरोधकर्ताओं को अनुरोध और सक्षम कर सकते हैं क्योंकि फिलहाल इसकी कार्यक्षमता बॉक्स के बाहर नहीं है – erPe

1

बस एक अनुमान (एक जवाब स्वरूपण को संरक्षित करने के रूप में यह पोस्टिंग) - स्कीमा में अपने उच्च-स्तरीय इकाई एक object, न कि एक array, कुछ इस तरह होना चाहिए:

schema: 
     type: object 
     properties: 
     items: 
      type: array 
      items: 
      type: string 
     message: 
      type: string 
     statusCode: 
      type: number 
संबंधित मुद्दे