0

我使用 mocha (6.2.2)、chai (4.2.0) 和 chai-http (4.3.0) 编写了一套测试来测试我们编写的微服务。有时,我们自己添加的 ETag 标头(首先使用 on-headers 侦听器删除“Express”标头)不会出现在收到的对 chai.request 调用的响应中。观察结果是:

  • 如果测试在与微服务相同的主机上运行,​​则收到的响应将始终具有所需的 ETag 标头;
  • 如果测试在与微服务不同的主机上运行,​​则收到的响应有时会有 ETag 标头;
  • 由于缺少 ETag 标头而失败的测试总是相同的(即使代码几乎相同);
  • 使用 POSTMAN 访问微服务 REST 端点总是正确返回带有 ETag 标头的响应;

从观察来看,我非常有信心我们的微服务很好。

这里开始

注意:在 Web 浏览器中运行时,同源策略仅允许 Chai HTTP 读取某些标头,这可能会导致断言失败。

(即使我们没有在浏览器中运行,我想这个原则仍然成立)。我尝试将 access-control-expose-headers 标头添加到微服务响应(包括 etag),但这并不能解决问题。

我有点假设这是一个 CORS 问题:其他可能性是 chai-http 不喜欢 etag 值;缺少 etag 的示例是:

166-Kd4TGzdykcFKsmm2U4aTYxewdzA

但是,使用此值添加任意标头(例如“Blah”)始终会导致标头出现...

响应包括以下 CORS 标头:

{
   "server":"openresty/1.15.8.2",
   "date":"Tue, 24 Mar 2020 13:21:37 GMT",
   "content-type":"application/json; charset=utf-8",
   "transfer-encoding":"chunked",
   "connection":"close",
   "vary":"Accept-Encoding",
   "strict-transport-security":"max-age=15724800; includeSubDomains",
   "x-powered-by":"Express",
   "access-control-allow-origin":"*",
   "access-control-expose-headers":"ETag,.....",
   "access-control-allow-credentials":"true",
   "access-control-allow-methods":"PUT, GET, POST, OPTIONS, DELETE",
   "content-encoding":"gzip"
}

(我也尝试添加 access-control-allow-headers 但这些似乎设置不正确:我认为这些在这里不相关)。

如果有人遇到与 chai-http/ETag/CORS 类似的问题并提出解决方案,我会很感兴趣?

迈克比尔

4

0 回答 0