Я пытаюсь разработать демонстрацию, которая извлекает один документ из API Cosmos DB SQL с использованием вызовов REST. У меня есть база данных в Azure, и в этой базе данных есть коллекция. Эта коллекция содержит два объекта на данный момент. Коллекция была создана с ключом раздела "/name". Код ниже работает, если я хочу, например, получить саму коллекцию. Однако мне нужно получить документ, используя идентификатор документа из определенной коллекции. Как я уже упоминал, я получаю ответ 200, когда речь идет о коллекции, но запрос одного документа выдает: «Ключ раздела« имя »или« / имя »(или что-то еще в этом пункте) недействителен».
Я пробовал всевозможные способы, как правильно настроить заголовочные файлы. В настоящее время два объекта в базе данных выглядят так:
{
"id": "test2",
"name": "bla2",
"_rid": "knQwAMkBmw4CAAAAAAAAAA= = ",
"_self": "dbs/knQwAA==/colls/knQwAMkBmw4=/docs/knQwAMkBmw4CAAAAAAAAAA==/",
"_etag": "\"140085d3-0000-0d00-0000-5cd760670000\"",
"_attachments": "attachments/",
"_ts": 1557618791
}
{
"id": "test",
"name": "bla1",
"_rid": "knQwAMkBmw4BAAAAAAAAAA= = ",
"_self": "dbs/knQwAA==/colls/knQwAMkBmw4=/docs/knQwAMkBmw4BAAAAAAAAAA==/",
"_etag": "\"140079d3-0000-0d00-0000-5cd75e680000\"",
"_attachments": "attachments/",
"_ts": 1557618280
}
Это в значительной степени мои желаемые результаты. Честно говоря, я в отчаянии. Я гуглил часами, и я просто не могу понять это правильно. Звонок авторизован. Может ли кто-нибудь указать мне правильное направление, как правильно настроить ключ раздела?
var request = require("request");
var crypto = require("crypto");
function getAuthorizationTokenUsingMasterKey(verb, resourceType, resourceLink, date, masterKey) {
var key = new Buffer(masterKey, "base64");
var text = (verb || "").toLowerCase() + "\n" +
(resourceType || "").toLowerCase() + "\n" +
(resourceLink || "") + "\n" +
date.toLowerCase() + "\n" +
"" + "\n";
var body = new Buffer(text, "utf8");
var signature = crypto.createHmac("sha256", key).update(body).digest("base64");
var MasterToken = "master";
var TokenVersion = "1.0";
return encodeURIComponent("type = " + MasterToken + "&ver = " + TokenVersion + "&sig = " + signature);
}
var mkey = '{my-master-key}';
var resourceType = 'docs';
var resourceLink = 'dbs/{MyDatabaseId}/colls/{MyCollId}/docs/test2';
var verb = 'GET';
var date = new Date().toUTCString()
var options = { method: 'GET',
url: 'https://{mycosmosdb}.documents.azure.com/dbs/{MyDatabaseId}/colls/{MyCollId}/docs/test2',
headers:
{ 'cache-control': 'no-cache',
Connection: 'keep-alive',
'accept-encoding': 'gzip, deflate',
'x-ms-documentdb-query-enablecrosspartition': true,
'Cache-Control': 'no-cache',
'x-ms-documentdb-PartitionKey': [ "name" ],
'x-ms-date': date,
'x-ms-documentdb-isquery': true,
'User-Agent': 'Microsoft.Azure.Documents.Client/1.6.0.0',
Host: '{mycosmosdb}.documents.azure.com:443',
'Content-Type': 'application/query+json',
Authorization: getAuthorizationTokenUsingMasterKey(verb,resourceType,resourceLink,date,mkey),
'x-ms-version': '2017-02-22',
Accept: 'application/json',
}
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.info(body);
});
{"code":"BadRequest","message":"Partition key name is invalid.\r\nActivityId: f73587d0-20d0-482f-9422-36c214e266d4, \r\nRequestStartTime: 2019-05-11T23:53:34.4517344Z, RequestEndTime: 2019-05-11T23:53:34.4517344Z, Number of regions attempted: 1\r\n, Microsoft.Azure.Documents.Common/2.2.0.0"}





Причина, по которой вы получаете эту ошибку, заключается в том, что значение заголовка x-ms-documentdb-PartitionKey должно быть значением атрибута PartitionKey в документе, а не именем PartitionKey.
Чтобы устранить проблему, измените следующую строку кода:
'x-ms-documentdb-PartitionKey': [ "name" ]
к
'x-ms-documentdb-PartitionKey': [ "bla2" ]
И вы не должны получить эту ошибку.
ОБНОВИТЬ
Поэтому я посмотрел код в Node SDK и выяснил, как он передает заголовок PartitionKey. По сути, значение заголовка должно быть строкой.
Пожалуйста, попробуйте со следующим значением:
'x-ms-documentdb-Partitionkey': "[\"bla2\"]",
Я только что попробовал, и это сработало для меня.
Вот заголовки, которые я передаю в запросе:
{
'x-ms-documentdb-Partitionkey': "[\"bla2\"]",
'x-ms-date': date,
'authorization': getAuthorizationTokenUsingMasterKey(verb,resourceType,resourceLink,date,mkey),
'x-ms-version': '2017-02-22'
}
Можете ли вы избавиться от заголовка x-ms-documentdb-query-enablecrosspartition из своего запроса и повторить попытку?
Обновил мой ответ. Надеюсь, это должно решить вашу проблему. Я смог получить детали документа.
Да! Вот и все! Это правильный ответ. Большое спасибо.
Привет. Я пробовал это. К сожалению, я получаю: "Ключ раздела bla2 недействителен...". Я не уверен, что еще я должен попробовать.