मैं फ्रंटएंड पर कोणीय के साथ एक वेब ऐप बना रहा हूं, और डेटाबेस के लिए बैकएंड पर गोलांग और मोंगो बना रहा हूं। मेरे पास डीबी अप एंड रनिंग है, और सभी रूट अनुरोधों का परीक्षण किया गया है और पोस्टमैन पर काम कर रहे हैं। हालाँकि, जब मैं कोणीय ऐप की सेवा पर DELETE अनुरोध या PUT अनुरोध करने का प्रयास करता हूं, तो मुझे निम्न त्रुटि का सामना करना पड़ता है:

"XMLHttpRequest तक पहुंच '-my api url-' मूल से 'http://localhost:4200' को ब्लॉक कर दिया गया है सीओआरएस नीति द्वारा: प्रीफ्लाइट अनुरोध का जवाब एक्सेस कंट्रोल चेक पास नहीं करता है: अनुरोधित संसाधन पर 'पहुंच-नियंत्रण-अनुमति-उत्पत्ति' शीर्षलेख मौजूद नहीं है।"

मैं GET और POST अनुरोध कर सकता हूं, लेकिन DELETE या PUT नहीं।

मैं इसके आसपास कैसे पहुंचू? क्या यह एक फ्रंटएंड मुद्दा है, या बैकएंड? किसी भी तरह की सहायता को आभार समझेंगे। धन्यवाद।

पीएस: मैं mongoHandlers का उपयोग कर रहा हूँ।

यहाँ सामने के छोर पर मेरी सेवा है:

deleteShow(showId: string) {
    let headers = new HttpHeaders();
    headers.append("Content-Type", "application/json");
    return this.http
      .delete<Show>(`${environment.apiBase}/shows/${showId}`, {
        headers
      })
      .pipe(catchError(this.handleError));
  }

बैकएंड कोड:

मार्ग:

func RouteShows(r *mux.Router, shows handlers.ShowHandler) {

    sub := r.PathPrefix("/api/shows").Subrouter()

    sub.HandleFunc("", getShows(shows)).Methods(http.MethodGet)
    sub.HandleFunc("/{id}", getShowById(shows)).Methods(http.MethodGet)
    sub.HandleFunc("/{id}", updateShow(shows)).Methods(http.MethodPut)
    sub.HandleFunc("", createShow(shows)).Methods(http.MethodPost)
    sub.HandleFunc("/{id}", deleteShow(shows)).Methods(http.MethodDelete)
    sub.HandleFunc("/status/{status}", getShowsByStatus(shows)).Methods(http.MethodGet)
}

एपीआई समारोह:

func deleteShow(s handlers.ShowHandler) http.HandlerFunc {

    return func(w http.ResponseWriter, r *http.Request) {

        params := mux.Vars(r)
        var show models.Show

        if _, ok := params["id"]; !ok {
            responses.BadRequestWrapped(w, errors.New("param not found: id"))
            return
        }

        err := s.DeleteShow(params["id"])
        if err != nil {
            responses.InternalServerErrorWrapped(w, errors.FromError(err)) //TODO
            return
        }

        responses.OK(w, show)
    }

}

मोंगोहैंडलर इंटरफ़ेस:

//ShowHandler handles the interface of mongo func
type ShowHandler interface {
    SearchShows(values map[string][]string, pagination *models.Pagination) ([]*models.Show, error)
    GetShows() ([]*models.Show, error)
    GetShowById(id string) (*models.Show, error)
    //GetAppointmentsCreatedByUser(username string) ([]*models.Appointment, error)
    GetShowsByStatus(status string) ([]*models.Show, error)

    CreateShow(show *models.Show) error
    UpdateShow(show *models.Show) error
    DeleteShow(id string) error
}

मोंगो हैंडलर:

//deleteShow removes a show based on Show ID from DB
func (s *shows) DeleteShow(id string) error {

    if _, err := s.mongo.DeleteOne(db_qcq, collection_shows, ValueEquals("_id", id)); err != nil {
        return err
    }

    return nil
}

आशा है कि यह परिप्रेक्ष्य देने के लिए पर्याप्त है।

1
ineedtoknow 18 अक्टूबर 2019, 15:26
अगर आप गूगल करते हैं और कुछ करने की कोशिश करते हैं तो आप इस मुद्दे पर बहुत सारी पोस्ट पा सकते हैं जैसे। stackoverflow.com/questions/7067966/…
 – 
jitender
18 अक्टूबर 2019, 15:34

2 जवाब

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

मुझे लगता है कि समस्या कोणीय पक्ष पर नहीं है, ऐसा लगता है कि NodeJs सर्वर DELETE अनुरोध को रोक रहा है। आपको इस अनुरोध प्रकार को नोड सर्वर पर अनुमति देने की आवश्यकता है।

नोट - सीओआरएस: क्रॉस-ओरिजिनल रिसोर्स शेयरिंग, इसका मतलब है कि आपको सर्वर को यह बताना होगा कि कौन से वैध स्रोत हैं, और कौन से वैध एचटीपी विधि प्रकार अनुरोध पर अनुमत हैं। (मैंने जोड़ा है * इसका मतलब है कि सभी स्रोतों की अनुमति है)

आप नीचे दिए गए कोड का उपयोग कर सकते हैं (यदि एक्सप्रेस का उपयोग कर रहे हैं)

// Initialize express middleware 
const express = require('express');
const app = express();

// Enable CORS
app.use(function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT,DELETE");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
    next();
});
2
Bhagvat Lande 18 अक्टूबर 2019, 15:42
धन्यवाद, मैंने इसे जोड़ा और यह काम किया। मुझे PUT अनुरोध को भी पुनर्गठित करना था, लेकिन यह अब काम कर रहा है।
 – 
ineedtoknow
18 अक्टूबर 2019, 16:53
हैप्पी कोडिंग :-)
 – 
Bhagvat Lande
19 अक्टूबर 2019, 17:09

बस इस नीचे दिए गए कोड को अपने हेडर में जोड़ें।

const httpOptions = {
  headers: new HttpHeaders({ 
    'Access-Control-Allow-Origin':'*',
    'Authorization':'authkey',
    'userid':'1'
  })
};
0
upinder kumar 18 अक्टूबर 2019, 15:45
उत्तर देने के लिए धन्यवाद! मैंने इसका उपयोग करने की कोशिश की लेकिन अभी भी कुछ कठिनाइयों में चल रहा था। (मुझे बिल्कुल यकीन नहीं था कि मैं सही तरीके से सम्मिलित कर रहा था।) मुझे पूरा यकीन है कि यह एक बैकएंड मुद्दा था, जब से मैंने भागवत लांडे के उत्तर को लागू करने के बाद मुझे यह काम मिल गया।
 – 
ineedtoknow
18 अक्टूबर 2019, 16:55