Как правильно извлечь документ из PropDB, используя специальное форматирование в запросе HTTP Trigger GET (функция Azure) - PullRequest
0 голосов
/ 03 июля 2019

Вот моя проблема:

Я пытаюсь настроить триггер http, используя функции Azure в javascript.Я был в состоянии отправить эти данные в Cosmosdb, используя мою функцию POST.Пример элемента CosmosDB Я ищу:

{
    "id": "POLL:FAVECOLORS:LM:LMBWZ18",
    "partition": "POLL:LM",
    "value": {
        "name": "fave colors poll",
        "question": "Which color do you like the most?",
        "answers": [
            {
                "text": "Orange",
                "count": 0
            },
            {
                "text": "Yellow",
                "count": 0
            },
            {
                "text": "Blue",
                "count": 0
            }
        ]
    },
    "_rid": "<info>",
    "_self": "<info>",
    "_etag": "\"<info>\"",
    "_attachments": "<info>/",
    "_ts": <info>
}

Я пытаюсь получить эту информацию с помощью ввода в мою функцию Azure.Вот моя функция.

{
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "route": "<MyURL>/{type}/{objname}/{brand}/{site}",
      "methods": [
        "get",
        "post",
        "patch"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    },
    {
      "name": "CosmosSend",
      "type": "documentDB",
      "databaseName": "PropDB",
      "collectionName": "WithoutCCN",
      "createIfNotExists": false,
      "connection": "<Connection-Info>",
      "direction": "out"
    },
    {
      "type": "documentDB",
      "name": "documents",
      "databaseName": "PropDB",
      "collectionName": "WithoutCCN",
      "connection": "<Connection-Info>",
      "direction": "in",
      "sqlQuery": "SELECT * FROM c WHERE c.id = {id}"
    }
  ],
  "disabled": false
}

Я не уверен, как я могу изменить формат моих запросов, чтобы он использовал параметры запроса для запроса вместо поиска "https: /// {type} / {objname} / {brand} / {site}? id = POLL: FAVECOLORS: LM: LMBWZ18 "

module.exports = function (context, req) {
    var documents = context.bindings.documents;
    var totalDocuments = documents.length;
    var azureAppId = req.headers["azure-app-id"];
    context.log('azure-app-id = ' + azureAppId);
     var idx = '' + (req.params.type + ':' + req.params.objname + ':' + req.params.brand + ':' + req.params.site).toUpperCase();
      var paritionx = '' + (req.params.type + ":" + req.params.brand).toUpperCase();
       var valuex = req.body;


    if (req.method === 'GET') {
            context.log('Found '+ totalDocuments +' documents');

            if(totalDocuments === 0)
{
                context.done(null, createResult(200, 'application/json', "The 
                requested document was not found."));

    }
    else {
        context.done(null, createResult(200, 'application/json', documents));
    }


    } else if (req.method === 'POST') {
        if (typeof req.body === 'object') {

            context.bindings.CosmosSend = JSON.stringify({
            id: idx,
            partition: paritionx,
            value: valuex
            });

            context.done(null, createResult(201, 'application/json', req.body));
        }
        else {
            context.done(null, createResult(400, 'text/plain', 'The message must be of type application/json.'));
        }

Я попытался взять переменную 'idx' и вставить ее в запрос, поскольку он уже находится в том же формате, что иPOST отправляет 'id', но, поскольку он не является частью самой функции. json, он не может быть найден.Если я изменю запрос в функции на:

"sqlQuery": "SELECT * FROM c WHERE c.id = /"{TYPE}:{OBJNAME}:{BRAND}:{SITE}/""

и что-нибудь отдаленно похожее на то, что это не работает.Если я запихну то, что я ищу, именно в это:

"sqlQuery": "SELECT * FROM c WHERE c.id = \"POLL:FAVECOLORS:LM:LMBWZ18\""

Он найдет его идеально каждый раз, но только одну эту запись, и это не будет соответствовать цели запроса GET, включая его собственную информацию о цели.Я действительно ломал голову над этой проблемой, и любые советы действительно помогли бы.Я прочитал много документов Microsoft, связанных с функцией Azure и JavaScript, но ничего не помогло с этой конкретной проблемой.

Ожидаемыми результатами будет элемент в космосе, возвращаемый при получении запроса http GET из приложения-функции Azure.он будет искать элемент по информации, указанной в URL-адресе запроса.

1 Ответ

0 голосов
/ 03 июля 2019

Вы пытались добавить id в качестве необязательного параметра в маршрут?

"route": "<MyURL>/{type:alpha}/{objname:alpha}/{brand:alpha}/{site:alpha}/{id:alpha?}",

Имейте в виду, что выполнение этого в одной и той же функции триггера HTTP всегда будетвыполнить запрос, даже на POST, где вы не отправляете идентификатор.Таким образом, вы потребляете RU, которые не используете.

В идеале вы бы разбили это на отдельные функции, одну для POST, одну для GET, которая помогает им масштабироваться независимо, и у вас больше разделение интересов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...