0

我有一个角度应用程序,它每 5 秒查询一次节点/快递后端端点。但是,有时我会收到一个 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) 阻止了具有 MIME 类型 text/html 的跨域响应 https://"".com/api/v1/transactions/f3debad2-a830-4168-9a03-475389dae7e0。有关详细信息,请参阅 https://www.chromestatus.com/feature/5629709824032768 。

同样,这种情况有时只会发生,有时我可以通过 200 个响应发出尽可能多的请求。

节点

我在后端设置了 CORS。

  app.use(cors());

笔记

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

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

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

4

2 回答 2

0

我不知道您在这 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 毫秒,但它对我不起作用。

我希望它会帮助你。

于 2020-04-26T21:00:12.663 回答
-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');但请记住不要在变量名中使用“-”。

于 2018-08-24T16:20:16.030 回答