如何在Cosmos DB服务端JS post-trigger中获取响应的etag header
Cosmos DB服务端Post-Trigger获取ETag报错解决方案
核心报错原因
你调用getValue时传入的header键名不符合服务端runtime的预期:
Cosmos DB数据库内运行的JS触发器的Response.getValue()方法对响应头键名大小写敏感,你使用的小写"etag"不是正确的键名,正确的ETag头键名为大写开头的"ETag"。
修复代码
直接修改键名即可正常读取:
// Retrieve item's new etag from the response var newETag = __.response.getValue("ETag");
特殊场景兼容(修改键名后仍报错)
如果你的请求固定设置了EnableContentResponseOnWrite = false,修改键名后仍然读取失败,是因为该配置会让服务端跳过填充非必要的响应元数据,ETag头不会暴露到触发器的Response对象中,可选择以下两种方案解决:
- 方案1:仅针对需要触发该触发器的写入请求,单独将
EnableContentResponseOnWrite设为true。该配置仅影响当前请求的客户端响应,不会全局修改业务逻辑,是成本最低的修复方式。 - 方案2:无需修改客户端参数,直接在触发器内部查询刚写入的文档获取ETag,参考代码如下:
// 从请求上下文获取刚写入文档的id和分区键值 var writtenDocId = __.request.getBody().id; var docPartitionKey = __.request.getBody().你的分区键字段名; // 服务端内部查询最新文档元数据 var queryAccepted = __.readDocument( `${__.getSelfLink()}docs/${writtenDocId}`, { partitionKey: docPartitionKey }, function(err, latestDoc) { if (err) throw err; // 直接从文档属性获取etag var newETag = latestDoc._etag; // 后续业务逻辑 } ); if (!queryAccepted) throw new Error("触发器执行失败:读取文档请求未被服务端接受");
内容的提问来源于stack exchange,提问作者Gilles jr Bisson
相关产品推荐
相关产品推荐

