Node.js, Express, Mongoose - input validation - within route or model? -
मेरे पास एक एपीआई संसाधन है जो एक JSON पोस्ट को स्वीकार करता है। उदाहरण:
{"स्थान": {"निर्देशांक": [-122.41941550000001, 37.7749295]} निर्देशांक तब एक्सप्रेस द्वारा अनुरोध से एकत्र किए जाते हैं :
module.exports.create = फ़ंक्शन (रिक, रिस, अगली) {var निर्देशांक = req.body.location.coordinates; .... ये तब एक मोंगोज़ मॉडल के लिए सबमिट किए गए हैं। मैं इस के खिलाफ परीक्षण लिख रहा हूं जहां स्थान। कॉरओर्डेनेट गायब हो रहा है उदा।
{"foo": {"bar": [-122.41941550000001, 37.7749295]} < P> यह तब मॉडल के सत्यापन अनुभाग के भीतर विफल रहता है: locationSchema.path ('location.coordinates')। मान्य करें (फ़ंक्शन (निर्देशांक) {^ TypeError: विधि कॉल नहीं किया जा सकता 'validate 'अनिर्धारित तो मेरा सवाल है कि मैं कैसे मान्य करूँगा कि इनपुट सही है? क्या यह मॉडल में जाने से पहले मार्ग में किया जाना चाहिए, या इसे मॉडल के बारे में कोई भी उदाहरण। संदर्भ के लिए मोंगोज़ मॉडल का ऐसा कुछ दिखता है:
var locationSchema = new schema ({userid : {प्रकार: संख्या, आवश्यक: सत्य}, स्थान: {प्रकार: [{प्रकार: "स्ट्रिंग", आवश्यक: सत्य, एन्यूम: ['बिंदु', 'लाइनस्ट्रिंग', 'बहुभुज'], डिफ़ॉल्ट: 'बिंदु'} ], आवश्यक: सच, निर्देशांक: {प्रकार: [संख्या], आवश्यक: सत्य}}, create_date: {प्रकार: तिथि, डिफ़ॉल्ट: तिथि। अभी व } }); LocationSchema.path ('location.coordinates') मान्य करें (फ़ंक्शन (निर्देशांक) {...}, 'अमान्य अक्षांश या देशांतर।'); मेरा खास तरीका मार्गों और मॉडल के बीच एक सर्विस लेयर पेश करना है I / और वह है जहां सत्यापन होता है। "वेब सेवा" अर्थ में "सेवा" न करें; यह केवल दिए गए डोमेन के आसपास एक अमूर्त स्तर प्रदान करता है इसमें निम्नलिखित लाभ हैं: - यह आपको स्थायी और / या बाहरी डेटा से निपटने के लिए एक आम अमूर्त देता है यही है, क्या आप मोंगोज़ या किसी बाहरी वेब सेवा से डेटा के साथ इंटरैक्ट कर रहे हैं, आपके सभी रूट लॉजिक एक सुसंगत इंटरफ़ेस के साथ सहभागिता कर सकते हैं।
- यह दृढ़ता के विवरण के आसपास ध्वनि इनकैप्सुलेशन प्रदान करता है, जिससे आप स्वैप कर सकते हैं अपने सभी मार्गों को प्रभावी किए बिना कार्यान्वयन को बाहर करें।
- यह गैर-रूट उपभोक्ताओं के साथ कोड का पुन: उपयोग करने की अनुमति देता है (जैसे कि एकीकरण परीक्षण सूट)।
- यह एक अच्छा प्रदान करता है मजाक के लिए परत (उदाहरण के लिए यूनिट परीक्षणों के उपयोग के लिए)।
- यह एक बहुत स्पष्ट "सत्यापन और व्यावसायिक तर्क यहां होता है" परत प्रदान करता है, भले ही आपका डेटा कई विभिन्न डेटाबेस और / या बैकएंड
location-service.js <पूर्व> var स्थान सेवा = मॉड्यूल। एक्सपोर्ट्स = {}; LocationService.saveCoordinates = function saveCoordinates (coords, cb) {यदि (! IsValidCoordinates (coords)) {// आपका असफल सत्यापन प्रतिक्रिया जो भी आप चाहते हैं, हो सकता है, लेकिन मैं // सही रनटाइम त्रुटियों के लिए वास्तविक `त्रुटि` प्रतिक्रियाओं को आरक्षित करना चाहता हूं I // परिणाम यहाँ कुछ होना चाहिए आपके क्लाइंट-साइड लॉजिक // आसानी से उपभोग और उपयोगकर्ता को प्रदर्शित कर सकते हैं वापसी सीबी (रिक्त, {सफलता: झूठी, कारण: 'सत्यापन', वैधीकरण त्रुटि: {/ * अंत उपयोगकर्ता के लिए उपयोगी कुछ * /}}); } YourLocationModel.save (कॉओर्स, फ़ंक्शन (गलती) {if (err) return cb (err); cb (null, {success: true});}); }; कुछ-मार्ग- file.js एप पोस्ट ('/ निर्देशांक' , फ़ंक्शन (रिक, रीस, अगली) {var निर्देशांक = req.body.location.coordinates; locationService.saveCoordinates (निर्देशांक, फ़ंक्शन (गलती, परिणाम) {यदि (गलती) आगे आती है (गलती); यदि (! Result.success ) {// चेक परिणाम.रेसन, मान्यकरण तर्क को संभाल लें, आदि} अन्य {// woohoo, एक 201 भेज या जो कुछ भी करने की आवश्यकता है}});}); मैंने इस संरचना को इस बिंदु पर 3 या 4 विभिन्न वेब एप्लिकेशन और एपीआई के लिए लागू किया है, और इसे बहुत पसंद किया है।
Comments
Post a Comment