2014-09-26 7 views
79

के साथ किए गए एक आरईएसटी एपीआई में प्रतिक्रिया स्थिति और जेएसओएन सामग्री सेट करने का उचित तरीका मैं नोडज के साथ खेल रहा हूं और एक छोटा सा एपीआई बनाकर व्यक्त कर रहा हूं। मेरा सवाल है, कोड स्थिति सेट करने के साथ-साथ प्रतिक्रिया डेटा सेट करने का अच्छा अभ्यास/सर्वोत्तम तरीका क्या है?नोडजेस और एक्सप्रेस

(मैं नोड और एक्सप्रेस कोड आवश्यक नहीं रखेंगे सर्वर, बस रूटर तरीकों कि चिंतित हैं शुरू करने के लिए) मेरे कोड का एक छोटा सा के साथ समझाता हूँ:

router.get('/users/:id', function(req, res, next) { 
    var user = users.getUserById(req.params.id); 
    res.json(user); 
}); 


exports.getUserById = function(id) { 
    for (var i = 0; i < users.length; i++) { 
    if (users[i].id == id) return users[i]; 
    } 
}; 

नीचे कोड पूरी तरह से काम करता है , और पोस्टमैन के साथ अनुरोध भेजते समय, मुझे निम्नलिखित परिणाम मिलते हैं: enter image description here

जैसा कि आप देख सकते हैं, स्थिति 200 दिखाती है, जो ठीक है। लेकिन क्या यह करने का यह सबसे अच्छा तरीका है? क्या कोई ऐसा मामला है जहां मुझे खुद को स्थिति, साथ ही लौटा JSON सेट करना होगा? या वह हमेशा एक्सप्रेस द्वारा संभाला जाता है?

उदाहरण के लिए, मैं सिर्फ एक त्वरित परीक्षण किए गए और थोड़ा संशोधित उपरोक्त विधि प्राप्त करें:

router.get('/users/:id', function(req, res, next) { 
    var user = users.getUserById(req.params.id); 
    if (user == null || user == 'undefined') { 
    res.status(404); 
    } 
    res.json(user); 
}); 

आप देख सकते हैं, यदि उपयोगकर्ता सरणी में नहीं पाया जाता है, मैं बस की स्थिति सेट हो जाएगा 404.

इस विषय के बारे में अधिक जानने के लिए संसाधन/सलाह स्वागत से अधिक हैं।

+0

यह मेरा उच्चतम रेट जवाब और यह स्वीकार नहीं किया गया है :(@ ड्यूकेबल, मुझे पता है कि यह थोड़ी देर हो गया है, लेकिन क्या यह आपके मुद्दे को हल करता है? –

+0

@ MichałDudak: हाँ, आपका उत्तर स्वीकार्य होना चाहिए। लेकिन यह ड्यूकेबल उपयोगकर्ता 15 अक्टूबर 2015 से सक्रिय नहीं है (31 जुलाई 2017 को)। अपने उत्तर के लिए +1 वैसे भी;) –

उत्तर

22
जब res.send, res.json, आदि

आप की तरह res.status(500).json({ error: 'something is wrong' });

स्थिति सेट कर सकते हैं अक्सर मैं कुछ की तरह कर दूँगा ...

router.get('/something', function(req, res, next) { 
    // Some stuff here 
    if(err) { 
    res.status(500); 
    return next(err); 
    } 
    // More stuff here 
}); 
का उपयोग कर डिफ़ॉल्ट होगा 200 का

स्थिति

फिर मेरी त्रुटि मिडलवेयर प्रतिक्रिया भेजें, और कुछ भी करें जो मुझे त्रुटि होने पर करने की ज़रूरत है।

इसके अतिरिक्त: res.sendStatus(status) संस्करण के रूप में जोड़ दिया गया है 4.9.0 http://expressjs.com/4x/api.html#res.sendStatus

102

एक्सप्रेस API संदर्भ इस मामले को शामिल किया गया: http://expressjs.com/4x/api.html#res.send

संक्षेप में, तुम सिर्फ json या send कॉल करने से पहले status विधि कॉल करने के लिए है:

res.status(500).send({ error: "boo:(" }); 
+2

यदि आप केवल एक स्टेटस कोड (कोई डेटा नहीं) भेजना चाहते हैं, तो विधि 'res.sendStatus (400) होगी;' –

14

मैं REST-ful URI Design पढ़ने की सलाह देते हैं और के बारे में स्थिति प्रतिक्रिया करने के लिए है HTTP Status Codes

अच्छा अभ्यास की एक सूची अनुमानित रूप से, त्रुटि के आधार पर उचित HTTP स्थिति कोड (क्लाइंट त्रुटियों के लिए 4xx, सर्वर त्रुटियों के लिए 5xx) के आधार पर, वास्तविक JSON प्रतिक्रिया के संबंध में कोई "बाइबल" नहीं है लेकिन एक अच्छा विचार स्थिति (डेटा) भेजने के लिए हो सकता है 2 अलग प्रोपे के रूप में एक सफल प्रतिक्रिया में रूट ऑब्जेक्ट की rties (इस तरह आप क्लाइंट को HTTP शीर्षलेख और पेलोड स्वयं से स्थिति को कैप्चर करने का मौका दे रहे हैं) और मामले में मानव-समझने योग्य तरीके से त्रुटि की व्याख्या करने वाली तीसरी संपत्ति एक त्रुटि का

Stripe's एपीआई असली दुनिया में समान व्यवहार करता है।

अर्थात

ठीक

200, {status: 200, data: [...]} 

त्रुटि

400, {status: 400, data: null, message: "You must send foo and bar to baz..."} 
29

आप इसे इस तरह से कर सकता है:

res.status(400).json(json_response); 

यह 400 HTTP स्थिति कोड सेट हो जाएगा, उस में भी काम करता है एक्सप्रेस 4.

+8

'एक्सप्रेस बहिष्कृत res.json (स्थिति, obj): उपयोग करें res.status (स्थिति) .json (obj) इसके बजाय ' तो,' res.status (400) .json (json_response) 'आजकल सटीक होगा। –

+0

हां, धन्यवाद ... इसे बहिष्कृत के रूप में चिह्नित किया गया है, लेकिन अभी भी काम करता है: पी आपकी टिप्पणी वैध, अच्छी बात है। – mzalazar

5

मैं अपने Express.js आवेदन में इस का उपयोग कर रहा:

app.get('/', function (req, res) { 
    res.status(200).json({ 
     message: 'Welcome to the project-name api' 
    }); 
}); 
संबंधित मुद्दे