Javascript 如何从存储过程中获取分区键作用域?
我在分区集合上有一个存储过程(在Azure Cosmos DB中)。它应该更新给定的文档,或者在文档不存在时创建它。由于集合是分区的,所以我需要分区键,存储过程将在其范围内执行以创建文档 如何从存储过程中获取与请求相关的分区密钥?Javascript 如何从存储过程中获取分区键作用域?,javascript,stored-procedures,azure-cosmosdb,Javascript,Stored Procedures,Azure Cosmosdb,我在分区集合上有一个存储过程(在Azure Cosmos DB中)。它应该更新给定的文档,或者在文档不存在时创建它。由于集合是分区的,所以我需要分区键,存储过程将在其范围内执行以创建文档 如何从存储过程中获取与请求相关的分区密钥? 根据文档(),分区键的请求头参数为:x-ms-documentdb-partitionkey 服务器端JavaScript SDK的文档说明了: Request对象表示发送到的请求消息 服务器。这包括有关HTTP头和消息体的信息 发送到服务器的HTTP请求。对于触发
根据文档(),分区键的请求头参数为:x-ms-documentdb-partitionkey 服务器端JavaScript SDK的文档说明了: Request对象表示发送到的请求消息 服务器。这包括有关HTTP头和消息体的信息 发送到服务器的HTTP请求。对于触发器,请求 表示运行触发器时正在执行的操作。 例如,如果触发器正在创建时运行(“触发”) 对于文档,则请求主体包含 要创建的文档。这可以通过请求访问 对象和(作为JSON)可以在JavaScript中本机使用。 对于存储过程,请求包含有关发送以执行存储过程的请求的信息。 我尝试从HTTP请求的头中获取分区密钥,如下所示:
getContext().getRequest().getValue('x-ms-documentdb-partitionkey') //returns: "Unable to get property 'value' of undefined or null reference"
getContext().getRequest()['x-ms-documentdb-partitionkey'] //returns: "undefined"
示例代码:
function createOrUpdateSproc(documentId) {
let isAccepted = __.queryDocuments(__.getSelfLink(),
`SELECT * FROM c WHERE c.id = "${documentId}"`,
function (err, feed, options) {
if (err) throw err;
// Check the feed and if empty, create document; otherwise take first element from feed.
if (!feed || !feed.length) {
createDocument();
} else {
replaceDocument(undefined, feed[0]);
}
}
);
if (!isAccepted) throw new Error('Querying refused.');
function createDocument() {
let documentBody = {
id: documentId,
partitionKey: __.request['x-ms-documentdb-partitionkey'], // Based on documentation.
counter: 1
};
let isAccepted = __.createDocument(__.getSelfLink(),
documentBody,
{ disableAutomaticIdGeneration: true },
replaceDocument);
if (!isAccepted) throw new Error('Creating refused.');
}
function replaceDocument(err, document, createOptions) {
...
}
}
我使用sp中的js代码打印
getRequest()
的结构
但我得到了下面的结构
"getx-ms-documentdb-script-enable-logging-------function () {\r\n return getValueInternal(propName);\r\n }++++getValue-------function (propertyName) {\r\n return getValueInternal(propertyName);\r\n }++++"
它与中提到的属性不匹配
也许您可以作为一种变通方法来实现相同的逻辑业务。只需将分区键作为参数传递给函数,然后使用函数方法中的cosmos db sdk进行查询、创建或更新。可以从应用程序、用户或任何其他客户端调用触发器函数。但是
getValue('x-ms-documentdb-partitionkey')
不应该工作吗?您认为这是服务器端的Cosmos DB错误吗?您认为getRequest()
的结构应该如何与文档相匹配?(我对JavaScript不太熟悉)另外,谢谢你的解决方案!实际上我也有同样的想法,唯一的区别是我将分区键传递给存储过程,而不是函数。不过,我真的很感兴趣的是如何正确地完成此操作。@Pyce如果您认为我的解决方法对您有帮助,您可以将其标记为答案,非常感谢。老实说,您建议在其他地方实现整个逻辑没有帮助,只是将分区键作为参数传递<代码>函数createOrUpdateSproc(documentId,partitionKey){…}
"getx-ms-documentdb-script-enable-logging-------function () {\r\n return getValueInternal(propName);\r\n }++++getValue-------function (propertyName) {\r\n return getValueInternal(propertyName);\r\n }++++"