इसलिए, मैंने एनईडीबी के साथ एक आरईएसटी एपीआई बनाया है और मुझे अपना पोस्ट मिल गया है और अनुरोध काम कर रहे हैं, लेकिन मुझे काम करने के लिए डिलीट अनुरोध नहीं मिल रहा है। मुझे कंसोल में 'हटाएं http://localhost:3000/api 400 (खराब अनुरोध)' त्रुटि मिलती रहती है।

मेरी सर्वर फ़ाइल में हटाएं अनुभाग यहां दिया गया है:

app.delete('/api', (request, response) => {
    database.remove({ _id: request }, {}, function(err, numRemoved) {});
});

यहाँ वह बटन है जो DELETE को क्रियान्वित करता है:

    document.body.addEventListener('click', function(event) {
        if (event.target.id == uid) {
            const options = {
                method: 'DELETE',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: uid
            };
            fetch('/api', options);
        };
    });

यह कहता है कि खराब अनुरोध fetch('/api', options); से आता है, लेकिन मुझे नहीं पता कि इसे कैसे ठीक किया जाए! क्या कोई मेरी मदद कर सकता है?

0
firecode85 29 अक्टूबर 2021, 01:19
क्या सर्वर-साइड में कोई त्रुटि हो रही है जिसे आप देख सकते हैं?
 – 
Samathingamajig
29 अक्टूबर 2021, 01:25

3 जवाब

सबसे बढ़िया उत्तर

त्रुटि इस तथ्य के कारण हो सकती है कि अनुरोध को हटाने के लिए एक जेसन बॉडी नहीं मिलनी चाहिए, आपको यूआईडी को पथ चर के रूप में पास करना चाहिए जैसे:

app.delete('/api/:uid', (request, response) => {
    const uid = request.params.uid;
    database.remove({ _id: uid }, {}, function(err, numRemoved) {});
});

और अपनी कॉल को इसमें बदलें:

    document.body.addEventListener('click', function(event) {
        if (event.target.id == uid) {
            const options = {
                method: 'DELETE',
            };
            const endpoint = `/api/${uid}`;
            fetch(endpoint, options);
        };
    });
0
Fernando Bravo Diaz 29 अक्टूबर 2021, 01:37
मैं देखता हूँ कि मैं कहाँ गलत हो गया! आपके सहयोग के लिए धन्यवाद!
 – 
firecode85
29 अक्टूबर 2021, 08:39

मुझे लगता है कि यह गलत धारणा के कारण हो सकता है कि DELETE अनुरोध किस लिए है।

DELETE विधि का मुख्य लक्ष्य यूरी में संसाधन को हटाना है। उदाहरण के लिए, DELETE पर /article/123 संसाधन को /article/123 पर हटा देता है, और इसका मतलब है कि भविष्य में उस स्थान पर GET अनुरोध के परिणामस्वरूप 404 या 410.

DELETE अनुरोध में एक निकाय होने का कोई मतलब नहीं है, क्योंकि यदि अनुरोध का उद्देश्य यूआरआई में संसाधन को हटाना है, तो शरीर में कुछ भी वास्तव में अनुरोध के अर्थ को और संशोधित नहीं करता है। HTTP निर्देश देता है कि DELETE (और GET और अन्य) का कोई शरीर नहीं होना चाहिए।

तो आप जो अनुरोध कर रहे हैं वह DELETE /api है, जिसका अर्थ है "/एपीआई संसाधन हटाएं"। शरीर अप्रासंगिक है (और आपकी त्रुटि का कारण बनता है)।

ऐसा लगता है कि आप अधिक RPC-शैली API के लिए जा रहे हैं। यदि आप केवल /api समापन बिंदु का उपयोग करते हैं, तो आपको संभवतः सभी विधियों को भूल जाना चाहिए और केवल POST का उपयोग करना चाहिए। आप वास्तव में आरईएसटी नहीं कर रहे हैं।

यदि आप करते हैं अधिक डिज़ाइन लागू करना चाहते हैं और उपयुक्त HTTP विधियों का उपयोग करना चाहते हैं, तो आपको यह सोचकर शुरू करना चाहिए कि आपके मार्ग कैसे संरचित हैं। याद रखें कि यह विधि बताती है कि आप किस प्रकार का ऑपरेशन कर रहे हैं, और यूआरआई बताता है कि आप उस ऑपरेशन को क्या कर रहे हैं। जो लोग अपने एपीआई को एक एकल समापन बिंदु (जैसे ग्राफक्यूएल और एसओएपी के साथ) के माध्यम से जाने के लिए डिज़ाइन करते हैं, वे अपने स्वयं के प्रोटोकॉल के लिए HTTP को 'सुरंग' के रूप में प्रभावी रूप से उपयोग करते हैं।

1
Evert 29 अक्टूबर 2021, 02:17
मुझे गहराई से स्पष्टीकरण देने के लिए समय निकालने के लिए धन्यवाद!
 – 
firecode85
29 अक्टूबर 2021, 08:43

मैं नहीं देख सकता कि uid कहां सेट है। हालांकि, आपके त्रुटि संदेश के आधार पर, मुझे लगता है कि uid वैध JSON ऑब्जेक्ट नहीं है। आप uid को { uid } जैसी किसी वस्तु में रख सकते हैं। फिर, अपने रूट हैंडलर में request.body.uid के साथ ऑब्जेक्ट पढ़ें।

साथ ही, पारंपरिक आरईएसटी एपीआई में एक डिलीट अनुरोध में शरीर नहीं होता है। इसके बजाय, आपका मार्ग /api/:id के प्रारूप में होगा। तब आपके अनुरोध url को "/api/" + uid होने के लिए अद्यतन करने की आवश्यकता होगी। फिर आप अपने रूट हैंडलर में req.params.id के साथ अनुरोध पैरामीटर पढ़ सकते हैं।

0
NeonD 29 अक्टूबर 2021, 01:35
यह कैसे काम करता है यह समझाने के लिए धन्यवाद!
 – 
firecode85
29 अक्टूबर 2021, 08:41