Angular/Graphile & CORS

Angular/Graphile & CORS

我花了一天多的时间试图理解这一点。我正在从事一个新的爱好项目,想学习 GraphQL。这是我当前的设置:

服务器:

客户:

我可以毫无问题地通过邮递员给我的 API 打电话。但是当我 运行 来自客户端的代码时,我得到了预期的“Access-Control-Allow-Origin 不允许来源 http://localhost:4200”。错误。

这是我的docker-compose.yml:

version: "3.3"
services:
    db:
        container_name: ccmm-postgres-dev
        restart: always
        image: ccmm-postgres-dev
        build:
            context: ./db
        volumes:
            - db:/var/lib/postgresql/data
        env_file:
            - ./.env
        networks:
            - network
        ports:
            - 5432:5432

    graphql:
        container_name: ccmm-graphql
        restart: always
        image: ccmm-graphql
        build:
            context: ./graphql
        env_file:
            - ./.env
        depends_on:
            - db
        networks:
            - network
        ports:
            - 5433:5433
        command:
            - --connection ${DATABASE_URL}
            - --watch
            - --dynamic-json
            - --no-ignore-rbac
            - --no-ignore-indexes
            - --show-error-stack=json
            - --extended-errors hint,detail,errcode
            - --graphiql /
            - --enhance-graphiql
            - --allow-explain
            - --port 5433
            - --cors
            - --schema ccmm_public
            - --jwt-secret ${JWT_SECRET}
            - --jwt-token-identifier ccmm_public.jwt_token
            - --default-role ccmm_guest
            - --append-plugins postgraphile-plugin-connection-filter

networks:
    network:

volumes:
    db:

如您所见,我的服务器上启用了 CORS(通过 --cors 选项)。但是,错误仍然存​​在。老实说,我不知道如何调试或分析这个问题。 我的前端也需要配置吗?

我找到了解决问题的方法!

我发现在我的案例中 Access-Control-Allow-Origin 错误是由于我的浏览器阻止了对我的 API 的外向调用。我的终点从来没有达到过。所以服务器层面的任何配置都不应在问题解决的这个阶段进行。

我最后做的是在我的 Angular 应用程序中配置代理。

我的图形服务器正在侦听 http://xxx.xxx.xxx.xxx:xxxx/graphql 端点。

在我的 Angular 应用程序的源根目录中,我创建了一个名为 proxy.conf.json:

的文件
{
    "/graphql": {
        "target": "http://xxx.xxx.xxx.xxx:xxxx",
        "secure": false,
        "logLevel": "debug"
    }
}

安全选项用于强制使用 SSL,我在这个开发阶段还没有。

为了将此配置用作代理,我将其添加到我的 angular.json:

...
 "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "my-project:build",
            "proxyConfig": "src/proxy.conf.json"
          },
...

然后重新启动我的 angular 项目,我现在能够到达我的 api 端点。

Graphile 中的 --cors 设置也不需要,所以我也删除了它。