角度和节点应用程序中的 CORS 不起作用

Posted

技术标签:

【中文标题】角度和节点应用程序中的 CORS 不起作用【英文标题】:CORS in angular and node application not working 【发布时间】:2020-05-01 16:09:23 【问题描述】:

我的(Dockerized)Angular 应用程序遇到了一些问题。 在我的 Angular 应用程序的 Edge/Firefox 上加载期间,填充我的主页所需的所有请求(RestApi)都没有到达我的应用程序。如果我用 Chrome 加载相同的页面,所有请求都到达,然后页面被填充。

我的 Angular 应用程序的 server.js 是:

    var express = require('express');
    var bodyParser = require('body-parser');
    var fs = require('fs');
    var http = require('http');
    var https = require('https');
    var cors = require('cors');
    var mongoose = require('mongoose');
    var qs = require('querystring');
    var fs = require('fs');
    const nodemailer = require('nodemailer');

    var env = process.env.NODE_ENV;

    // Node express server setup.
    var app = express();
    app.set('port', 4200);   
    app.use(cors());
    app.use(function(req, res, next) 
      res.header("Access-Control-Allow-Origin", "*");
      res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
      next();
    );
    app.use(bodyParser.json()); 
    app.use(bodyParser.urlencoded(
        extended : true
    ));
    app.use(express.json()); // to support JSON-encoded bodies 


        var server = https.createServer(proxyOption, app);
        server.listen(app.get('port'), function() 
            console.log('Express server listening on port ' + app.get('port'));
        );

        // redirect requests from HTTP to HTTPS
        http.createServer(function (req, res) 
            console.log('Redirect HTTP request to https://' + req.headers['host'] + req.url);
            res.writeHead(301,  "Location": "https://" + req.headers['host'] + req.url );
            res.end();
        ).listen(80);

这是 CORS 无法正常工作的问题吗? 我还看到建议将以下值放入polyfills.ts 文件中:

    -----> (window as any).__Zone_enable_cross_context_check = true;
    import 'zone.js/dist/zone';  // Included with Angular CLI.

微软边缘 在这里您可以看到在 Edge 上加载的相同请求不起作用并且标头为空,这听起来很奇怪 边缘控制台

在 Chrome 上

火狐

为什么 Access-Control-Allow-Headers 只出现在 Chrome 中而不出现在 Firefox 中? (同一页)

为什么当我使用 Edge/Firefox 加载时以下代码不可见?

app.all("/db/config", function(req, res, next) 
    console.log(req.method + ' ' + req.url);             <--- Visible only with Chrome
    processDbRequest(req, res, Config);
);

我正在使用以下命令启动应用程序:

ng serve --host 0.0.0.0 --port 443 --public-host IP --ssl --ssl-key /run/secrets/secret.key --ssl-cert /run/secrets/secret.cert --proxy-config server.js --prod

你怎么看? 提示

无论如何,在 Chrome 上,Edge/Firefox 的标题中都看不到部分 (CORS)。

更新 EDGE 中可见的错误是:

Uncaught (in promise): Response with status: 0 for URL: null"
[object Error]: description: "Uncaught (in promise): Response with status: 0 for URL: null", message: "Uncaught (in promise): Response with status: 0 for URL: null", promise: Object, rejection: Object, stack: "Error: Uncaught (in promise): Response with status: 0 for URL: null at M (https://<IP>/polyfills.126a602ce79d269ee3a3.js:1:14070) at M (https://<IP>/polyfills.126a602ce79d269ee3a3.js:1:13634) at Anonymous function (https://<IP>/polyfills.126a602ce79d269ee3a3.js:1:14864) at t.prototype.invokeTask (https://<IP>/polyfills.126a602ce79d269ee3a3.js:1:8720) at onInvokeTask (https://<IP>/main.962c274fd5e7aea50f8c.js:1:422471) at t.prototype.invokeTask (https://<IP>/polyfills.126a602ce79d269ee3a3.js:1:8720) at e.prototype.runTask (https://<IP>/polyfills.126a602ce79d269ee3a3.js:1:4000) at g (https://<IP>/polyfills.126a602ce79d269ee3a3.js:1:11104) at e.invokeTask (https://<IP>/polyfills.126a602ce79d269ee3a3.js:1:9950) at m (https://<IP>/polyfills.126a602ce79d269ee3a3.js:1:23265)"...

这里package.json配置:


  "name": "elg-dash",
  "version": "0.0.0",
  "scripts": 
    "ng": "ng",
    "start": "export NODE_ENV=dev && ng serve --port 3000 --proxy-config server.js ",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  ,
  "private": true,
  "dependencies": 
    "@angular/animations": "~7.2.0",
    "@angular/common": "~7.2.0",
    "@angular/compiler": "~7.2.0",
    "@angular/core": "~7.2.0",
    "@angular/forms": "~7.2.0",
    "@angular/http": "^7.2.15",
    "@angular/platform-browser": "~7.2.0",
    "@angular/platform-browser-dynamic": "~7.2.0",
    "@angular/router": "~7.2.0",
    "@eds/vanilla": "^3.4.0",
    "body-parser": "^1.19.0",
    "core-js": "^2.5.4",
    "cors": "^2.8.5",
    "d3": "^5.12.0",
    "dragula": "^3.7.2",
    "express": "^4.17.1",
    "mapbox-gl": "^1.4.1",
    "microsoft-adal-angular6": "^1.3.0",
    "mongoose": "^5.7.5",
    "ng2-completer": "^3.0.2",
    "ng2-datepicker": "^3.1.1",
    "ng2-smart-table": "^1.5.0",
    "ngx-permissions": "^7.0.3",
    "nodemailer": "^6.3.1",
    "rxjs": "~6.3.3",
    "tslib": "^1.9.0",
    "zone.js": "~0.8.26"
  ,
  "devDependencies": 
    "@angular-devkit/build-angular": "~0.13.0",
    "@angular/cli": "~7.3.9",
    "@angular/compiler-cli": "~7.2.0",
    "@angular/language-service": "~7.2.0",
    "@types/jasmine": "~2.8.8",
    "@types/jasminewd2": "^2.0.8",
    "@types/node": "~8.9.4",
    "codelyzer": "~4.5.0",
    "jasmine-core": "~2.99.1",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~4.0.0",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~2.0.1",
    "karma-jasmine": "~1.1.2",
    "karma-jasmine-html-reporter": "^0.2.2",
    "protractor": "~5.4.0",
    "rxjs-compat": "~6.5.3",
    "ts-node": "~7.0.0",
    "tslint": "~5.11.0",
    "typescript": "~3.2.2"
  

小更新

似乎相同的 Angular 应用程序可以在以下版本的 Firefox 中运行:72.0.1(64 位),相同的应用程序在 Linux 版本 72.0 上无法运行。 1 个(64 位).

【问题讨论】:

当您查看 Edge 中开发人员工具的“网络”选项卡时,很容易发现 CORS 错误。你看到那里有任何错误吗?还是在控制台选项卡中? 检查网络标签或控制台标签 嗨@HereticMonkey 我已经用一些图片更新了帖子 响应为 200 OK,因此不太可能是 CORS 错误(通常状态为 0)。 @HereticMonkey 奇怪的想法是我无法像您在 Chrome(在 Edge 上)上看到的那样看到请求标头 【参考方案1】:

@Prisco 很难说它是 CORS,因为在这种情况下你无法获得 200 OK 状态。 您的图像没有给出任何提示。根据我之前使用 JBOSS(而不是 docker)在服务器上使用 Angular 时遇到相同问题的经验,我猜你发生了一些情况。

    检查响应,看看有没有像failed to load... 这样的消息? 如果是,那么某些东西会阻止您的响应。它可能是您的网络服务器,也可能是您的计算机软件,例如防病毒软件。

    检查你的页面是什么样子的?空白页?如果是,那是因为你的前端配置像 polyfill 和 browserlist。

    逐行比较,看看 Chrome 和 Edge 之间的差异,看看有什么不同,然后用谷歌搜索。

    您能否尝试在没有 docker 的情况下部署您的项目以查看它是否工作。如果它工作正常,那么您的 docker 配置有问题。

【讨论】:

与火狐浏览器上的 GET 请求相关我可以在安全选项卡中看到 SSL_ERROR_BAD_CERT_DOMAIN,在 Edge 上不可见 @Prisco 是的 SSL 也可以阻止您的回复。只允许您的页面来自地址上的图标或使用http 嗨@Hoang,我需要使用https,似乎有些东西阻止了请求,因为在我的角度应用程序中,一旦加载页面,我就没有收到任何RestAPI,而是加载相同的页面使用 Chrome,我可以看到许多获取请求到达。似乎服务器和代理之间的通信无法正常工作:-( 您是否为您的应用程序添加了 SSL 证书?如果没有安装 SSL 证书,您可以从这里wikihow.com/Install-an-SSL-Certificate 获得一些提示 是的,我正在使用证书并启动我的应用程序:ng serve --host 0.0.0.0 --port 443 --public-host --ssl --ssl-key /run/ secrets/secret.key --ssl-cert /run/secrets/secret.cert --proxy-config server.js --pro d

以上是关于角度和节点应用程序中的 CORS 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

CORS 中间件在 nodeJS 中不起作用

vertx应用程序中的CORS问题不起作用

AngularJS和rails cors标头不起作用

弹簧靴中的 CORS 不起作用 - 得到空响应

在客户端下载压缩文件夹在角度+节点(MEAN)中不起作用

带有 Spring 的 CORS 不起作用