Заблокировано ошибкой политики CORS при обращении к mongo / golang db с угловым веб-приложением - PullRequest
0 голосов
/ 18 октября 2019

Я делаю веб-приложение с угловым интерфейсом и golang и mongo для базы данных. У меня есть база данных и работает, и все запросы маршрута были проверены и работают на Почтальон. Однако, когда я пытаюсь сделать запрос DELETE или запрос PUT на службу углового приложения, я получаю следующую ошибку:

"Доступ к XMLHttpRequest по '-my api url-' from origin 'http://localhost:4200' было заблокировано политикой CORS: Ответ на запрос предварительной проверки не проходит проверку контроля доступа: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». "

Iможет делать запросы GET и POST, но не DELETE или PUT.

Как мне обойти это? Это проблема внешнего интерфейса или бэкэнда? Любая помощь будет оценена. Спасибо.

PS: я использую 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)
}

API-функция:

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)
    }

}

Интерфейс MongoHandler:

//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
}

Обработчик Mongo:

//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
}

Надеюсь, этого достаточно, чтобы дать перспективу.

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Я думаю, что проблема не на стороне, похоже, сервер NodeJs блокирует запрос DELETE. Вы должны разрешить этот тип запросов на сервере узла.

Примечание. CORS: общий доступ к ресурсам из разных источников. Это означает, что вам нужно указать серверу, с какого источника он является действительным, а какие - с действительными типами методов Http. разрешены по запросу. (Я добавил *, что означает, что все источники разрешены)

Вы можете использовать приведенный ниже код (если используется экспресс)

// 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();
});
0 голосов
/ 18 октября 2019

Просто добавьте следующий код в свои заголовки.

const httpOptions = {
  headers: new HttpHeaders({ 
    'Access-Control-Allow-Origin':'*',
    'Authorization':'authkey',
    'userid':'1'
  })
};
...