【问题标题】:Angular CORS Issue - Querying an endpoint every 5 secondsAngular CORS 问题 - 每 5 秒查询一次端点
【发布时间】:2019-01-31 03:47:27
【问题描述】:

我有一个 Angular 应用程序,它每 5 秒查询一次节点/express 后端端点。但是,有时我会遇到 cors 错误。

用例

  1. 用户创建交易。事务被添加到数据库中,状态为“待处理”
  2. 前端会定期查询数据库,直到状态更新为“已完成”。所以它可以检索结果。

角度

我每 5 秒执行一次 http 获取请求

   const url = 'https://<removed>.com/api/v1/transactions/' + transactionId;

    interval(5000)
        .pipe(
            switchMap(() => this.httpClient.get(url)),
            tap((response: any) => {
                this.summary = response;
            }),
            takeWhile((response: any) => response.data['status'] !== 'Completed'),
    ).subscribe();

}

第一个请求很好,然后我在下一个请求时收到以下错误。

加载失败 https://"".com/api/v1/transactions/f3debad2-a830-4168-9a03-475389dae7e0: 请求中不存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:4200” 使用权。响应的 HTTP 状态代码为 502。

跨域读取阻塞 (CORB) 阻止了跨域响应 https://"".com/api/v1/transactions/f3debad2-a830-4168-9a03-475389dae7e0 MIME 类型为 text/html。看 https://www.chromestatus.com/feature/5629709824032768 了解更多 详情。

这只是有时会发生,其他时候我可以通过 200 个响应发出尽可能多的请求。

节点

我在后端设置了 CORS。

  app.use(cors());

注意

我不确定这是否是一个完整的服务器端问题。这是一个随机的边缘情况。我的所有其他 API 请求(包括 POST 请求)都可以正常工作。

实际上,在它开始间隔 5 秒检查结果是否准备好之前,它会发布到同一域上的端点,没有问题。

我已经完成了 10 个测试用例,每个测试将查询端点 3-4 次(通常在结果准备好/完成之前需要很长时间)。所有10个测试用例都可以,那么第11个可能有这个问题。

【问题讨论】:

  • 你在哪里托管你的角度?是http还是https?
  • 如果它返回 502,听起来错误在您的后端,而不是在 Angular 中。您在哪里/如何托管/运行后端?
  • @mehta-rohan 托管在 https 上,后端也是 https
  • 您是否尝试过延长投票时间?也许您的请求有时比您预期的要花费更多时间
  • @user184994 在 amazon ec2 上托管的 docker 镜像中容器化。

标签: node.js angular express http-status-code-502


【解决方案1】:

我不知道您在这 2 年中是否解决了您的问题。 但是昨天我遇到了同样的错误。

起初我认为这也是 CORS 问题,在我看到第二次调用中的标头丢失和标头中的“keep-alive”标签后,我找不到任何关于我的承诺的信息,所以我尝试关闭通过等待一些时间自动“保持活动”连接。

我不使用 takeWhile 来制作循环,我更喜欢 for 循环,因为它可以在其中使用 await 函数。

for(const list of lists){
    await this.httpClient.get(url).toPromise();
    await this.delay(500);
}

delay(ms: number) {
    return new Promise( resolve => setTimeout(resolve, ms) );
}

我尝试使用 100 和 200 毫秒,但它不适合我。

希望对你有帮助。

【讨论】:

    【解决方案2】:
    app.use(function(req, res, next) {
      res.setHeader('Access-Control-Allow-Origin', '*');
      res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
      res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
      res.setHeader('Access-Control-Expose-Headers','Content-Type,expire');
     next();
    });
    

    在你的服务器上试试这个。如果您想传递额外的标头参数,您需要在res.setHeader('Access-Control-Allow-Headers', 'Content-Type , token'); 中添加这些变量,但请记住不要在变量名中使用“-”。

    【讨论】:

    • 我不是已经在使用 npm cors 包了吗?您的代码中有什么不同之处可以解决这个问题?考虑到使请求与其他端点和这个端点一起工作正常,除非使用上述角度代码npmjs.com/package/cors 定期将其发送到同一个端点
    • 有时包裹无法交付,我也遇到了这个问题,并以这种方式解决了这个问题,对我有用。
    • @Kay cors() 不保证所有设置。您必须明确定义所有这些
    • 没问题,只要检查你的脚本标签是否在正确的地方
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2019-08-13
    • 2013-05-13
    • 2013-04-25
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 2018-06-05
    相关资源
    最近更新 更多