Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从存储过程中获取分区键作用域?_Javascript_Stored Procedures_Azure Cosmosdb - Fatal编程技术网

Javascript 如何从存储过程中获取分区键作用域?

Javascript 如何从存储过程中获取分区键作用域?,javascript,stored-procedures,azure-cosmosdb,Javascript,Stored Procedures,Azure Cosmosdb,我在分区集合上有一个存储过程(在Azure Cosmos DB中)。它应该更新给定的文档,或者在文档不存在时创建它。由于集合是分区的,所以我需要分区键,存储过程将在其范围内执行以创建文档 如何从存储过程中获取与请求相关的分区密钥? 根据文档(),分区键的请求头参数为:x-ms-documentdb-partitionkey 服务器端JavaScript SDK的文档说明了: Request对象表示发送到的请求消息 服务器。这包括有关HTTP头和消息体的信息 发送到服务器的HTTP请求。对于触发

我在分区集合上有一个存储过程(在Azure Cosmos DB中)。它应该更新给定的文档,或者在文档不存在时创建它。由于集合是分区的,所以我需要分区键,存储过程将在其范围内执行以创建文档

如何从存储过程中获取与请求相关的分区密钥?


根据文档(),分区键的请求头参数为: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                }++++"