我使用 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 类似的问题并提出解决方案,我会很感兴趣?
迈克比尔