当前位置: 首页 > 知识库问答 >
问题:

使用角度 Web 应用程序调用 mongo/golang db 时被 CORS 策略错误阻止

南宫云
2023-03-14

我正在制作一个Web应用程序,前端为角,后端为数据库使用Go语言和mongo。我启动并运行了数据库,所有路由请求都已经过测试并在Postman上运行。但是,当我尝试在角应用程序的服务上发出DELETE请求或PUT请求时,我会遇到以下错误:

“通过'-my api url-'从源代码'访问XMLHttpRequest”http://localhost:4200'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在'access control Allow Origin'标头。“

我可以发出GET和POST请求,但不能删除或放置。

我该怎么解决这个问题?这是前端问题还是后端问题?任何帮助都将不胜感激。非常感谢。

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个答案

裴姚石
2023-03-14

只需将下面的代码添加到您的标题中。

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

我认为问题不在角度上,看起来NodeJs服务器正在阻止DELETE请求。您需要允许在节点服务器上键入此请求。

注意- CORS:跨源资源共享,这意味着你需要告诉服务器哪些是有效的源,哪些是有效的Http方法类型被请求所允许。(我添加了*表示允许所有来源)

您可以使用以下代码(如果使用express)

// 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();
});
 类似资料:
  • 我有一个Android、Ios和web应用程序,它使用php作为后端。所有Api在android和ios中都运行良好,但在web中抛出CORS错误。得到这样的错误 访问位于“”的XMLHttpRequesthttps://example.com/api“起源”http://localhost:49168'已被CORS策略阻止:请求的资源上不存在'Access Control Allow Origi

  • 如果用户单击“允许”,应用将从 Reddit 接收授权代码,以便它可以向 Reddit API 发出 API 请求。从上面可以看出,将用户导航到上方页面的URL适用于桌面chrome浏览器。然而,在Android模拟器中,我可以从网络视图看到reddit上的加载页面,但是网络视图突然在Logcat上出现以下错误: “访问位于'的XMLHttpRequest”https://events.reddi

  • 我了解了Firebase托管的标头配置,所以我这样做了: 在app中,在didChangeDependencies中有一个简单的firebase初始化,带有所需的数据。然后firebase auth . instance . signinwithemailandpassword(...)关于index.html的一段关于火垒的话: 我在Chrome中测试过很多次,总是失败。只有在localhost

  • 当我试图使用axios对Tomcat 8服务器进行API调用时,出现了以下错误。 被CORS策略阻止:请求的资源上不存在“Access Control Allow Origin”标头。

  • 我正在构建一个供iOS/Android应用程序使用的API。该应用程序使用JSON Web Token来验证用户。我在尝试从本机应用程序与API对话时遇到了CORS问题。所以我为所有来源添加了CORS头(只在以< code>/api/开头的URL上)。它现在工作正常,但我想知道我所做的是否不是一个潜在的漏洞? 我应该允许所有的起源吗?如果API要被原生应用请求,我有办法提前知道原生主机吗? 我挺迷