chai-http 在某些情况下无法看到 ETag头,可能是由于CORS引起?

我使用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头;

通过观察,我非常有信心我们的微服务没问题。

来自[这里](https://www.chaijs.com/plugins/chai-http/),

注意:在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,并想出了解决方案??

Mike Beale

点赞