如何使用http Trigger GET请求(Azure函数)中的特定格式正确地从PropDB中检索文档

时间:2019-07-03 13:46:17

标签: javascript azure azure-cosmosdb

这是我的问题:

我正在尝试使用javascript中的Azure函数来设置http触发器。我已经能够使用POST函数将此数据发布到Cosmosdb中。 我要寻找的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函数中来提取此信息。 这是我的function.json。

{
  "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'的格式相同,但是由于它不属于function.json本身,因此无法被发现。如果我将函数中的查询更改为:

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

和任何遥不可及的东西都认为它不起作用。如果我将想要的东西完全塞进去了:

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

它每次都能完美地找到它,但是只有一条记录,它违反了GET请求的目的,包括它自己的目标信息。 我确实一直在这个问题上绞尽脑汁,任何提示都将真正有帮助。我已经阅读了很多与Azure函数和javascript相关的Microsoft文档,但是对于解决此特定问题没有任何帮助。

预期结果将是从Azure Function应用发出http GET请求时返回的宇宙项。它将通过位于请求网址中的信息来查找项目。

1 个答案:

答案 0 :(得分:0)

您是否尝试过将fields.String(attribute=lambda x: str(EnumGender(x.FieldContainingEnum).name)) 作为optional parameter添加到路由中?

id

请记住,即使在不发送ID的POST上,在同一HTTP触发函数中执行此操作也将始终执行查询。因此,您正在消耗未使用的RU。

理想情况下,您可以将其拆分为单独的功能,一个用于POST,一个用于GET,这有助于它们独立扩展,并且您将关注点分离得更大。