नोडज और एक्सप्रेस के साथ बनाए गए REST API में प्रतिक्रिया की स्थिति और JSON सामग्री सेट करने का उचित तरीका


187

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

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

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];
  }
};

नीचे दिया गया कोड पूरी तरह से काम करता है, और डाकिया के साथ अनुरोध भेजते समय, मुझे निम्नलिखित परिणाम मिलते हैं: यहां छवि विवरण दर्ज करें

जैसा कि आप देख सकते हैं, स्थिति 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 की स्थिति निर्धारित करूंगा।

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


3
यह मेरा उच्चतम रेट जवाब है और यह स्वीकार नहीं है :( @dukable, मुझे पता है कि यह एक समय हो गया है, लेकिन यह आपकी समस्या का समाधान किया?
मीकल Dudak

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

जवाबों:


230

एक्सप्रेस एपीआई संदर्भ इस मामले को कवर करता है।

स्थिति देखें और भेजें

संक्षेप में, आपको कॉल statusकरने से पहले विधि को कॉल करना होगा jsonया send:

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

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

3
यह किसी भी अधिक काम नहीं कर रहा है। प्रतिक्रिया को सही स्थिति कोड के साथ भेजा जाता है, लेकिन कोई निकाय नहीं ....
लंदनबोर

2
मेरी पिछली टिप्पणी पर ध्यान न दें। यदि आप स्थिति 204 पर सेट करते हैं (कोई सामग्री नहीं) तो यह शरीर को नहीं भेजता है।
लंदनरॉब

2
@ इंटरनेट-निको res.sendStatus(400);एक स्ट्रिंग डेटा भी भेजता है, इसके बराबर हैres.status(400).send('Not Found')
Davide

74

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

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

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


17
express deprecated res.json(status, obj): Use res.status(status).json(obj) instead इसलिए, res.status(400).json(json_response)आजकल सटीक होगा।
विल लूसी

हां, धन्यवाद ... यह पदावनत के रूप में चिह्नित है, लेकिन फिर भी काम करता है: पी आपकी टिप्पणी वैध, अच्छी बात है।
मज़ारज़ार


41

200 की स्थिति डिफ़ॉल्ट का उपयोग करते समय हो जाएगा 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
});

फिर मेरी त्रुटि मिडलवेयर ने प्रतिक्रिया भेज दी है, और जब कोई त्रुटि हो तो मुझे कुछ और करने की आवश्यकता है।

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


23

HTTP स्थिति कोड की एक सूची

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

स्ट्राइप का एपीआई वास्तविक दुनिया में समान व्यवहार करता है।

अर्थात

ठीक है

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

त्रुटि

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

13

मैं अपने Express.js एप्लिकेशन में इसका उपयोग कर रहा हूं:

app.get('/', function (req, res) {
    res.status(200).json({
        message: 'Welcome to the project-name api'
    });
});

5

पूर्ण HttpResponse पाने के लिए मानक तरीका जिसमें निम्नलिखित गुण शामिल हैं

  1. body // में आपका डेटा है
  2. हेडर
  3. ठीक है
  4. स्थिति
  5. statusText
  6. प्रकार
  7. यूआरएल

पर बैकएंड , ऐसा करने

router.post('/signup', (req, res, next) => {
    // res object have its own statusMessage property so utilize this
    res.statusText = 'Your have signed-up succesfully'
    return res.status(200).send('You are doing a great job')
})

पर दृश्यपटल जैसे में Angular, बस कार्य करें:

let url = `http://example.com/signup`
this.http.post(url, { profile: data }, {
    observe: 'response' // remember to add this, you'll get pure HttpResponse
}).subscribe(response => {
    console.log(response)
})




0

त्रुटि प्रतिक्रिया भेजने का सबसे अच्छा तरीका होगा return res.status(400).send({ message: 'An error has occurred' })

फिर, आपके सामने वाले हिस्से में आप इसे कुछ इस तरह से पकड़ सकते हैं:

        url: your_url,
        method: 'POST',
        headers: headers,
        data: JSON.stringify(body),
    })
        .then((res) => {
            console.log('success', res);
        })
        .catch((err) => {
            err.response && err.response.data && this.setState({ apiResponse: err.response.data })
        })

बस लॉगिंग errसे काम नहीं चलेगा, क्योंकि आपका भेजा हुआ संदेश ऑब्जेक्ट में रहता है err.response.data

उम्मीद है की वो मदद करदे!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.