Azure Function App HTTP 触发来自请求正文的 CosmosDB 输入查询

Posted

技术标签:

【中文标题】Azure Function App HTTP 触发来自请求正文的 CosmosDB 输入查询【英文标题】:Azure Function App HTTP Trigger CosmosDB input query from the request's body 【发布时间】:2019-05-13 20:20:10 【问题描述】:

我创建了一个通过 HTTP POST 请求触发的 Azure 函数。 该请求的正文如下:


    "start": '2018-07-25T08:47:16.094Z',
    "end": '2018-07-25T08:47:24.686Z'

index.js

module.exports = async function (context, req) 
    context.log('javascript HTTP trigger function processed a request.');

    var inputDocument = context.bindings.inputDocument;
    context.log("INPUT DOCUMENT: " + JSON.stringify(inputDocument));
    context.res = 
            status: 200,
            body: "OK",
        ;
;

function.json


  "bindings": [
    
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "post"
      ]
    ,
    
      "type": "http",
      "direction": "out",
      "name": "res"
    ,
    
      "type": "cosmosDB",
      "name": "inputDocument",
      "databaseName": "Messages",
      "collectionName": "Collection1",
      "sqlQuery": "SELECT * FROM Collection1 c WHERE c.message.timestamp>=start AND c.message.timestamp<=end",
      "connectionStringSetting": "cosmosdbaccount_DOCUMENTDB",
      "direction": "in"
    
  ]

我想使用以下两个参数查询 CosmosDB 实例:

"sqlQuery": "SELECT * FROM Collection1 c WHERE c.message.timestamp>=start AND c.message.timestamp<=end",

像我在这里展示的那样做会导致 CosmosDB 的 inputBinding 未定义。

2018-12-13T08:19:54.332 [Information] Executing 'Functions.Function1' (Reason='This function was programmatically called via the host APIs.', Id=af8090a4-5fab-4fbd-b26f-a045d8900d9b)
2018-12-13T08:19:56.704 [Information] JavaScript HTTP trigger function processed a request.
2018-12-13T08:19:56.711 [Information] INPUT DOCUMENT: []
2018-12-13T08:19:56.755 [Information] Executed 'Functions.Function1' (Succeeded, Id=af8090a4-5fab-4fbd-b26f-a045d8900d9b)

如果我在 CosmosDB 数据资源管理器中运行相同的查询,用正确的 ISO 时间戳替换 startend,它会返回所有四个文档。

我错过了什么吗?我真的没有在网上找到任何关于这个话题的东西,所以我希望有人已经偶然发现了它。

提前非常感谢!

【问题讨论】:

【参考方案1】:

空结果现在似乎是预期的。在 CosmosDB bingding 中,sqlQuery 难以处理嵌套令牌(startend 是请求正文的属性),related issue here。

这里有三种解决方法可供尝试。

    只需将startend 放入查询字符串中,如https://functionUrl?start=&lt;timeA&gt;&amp;end=&lt;timeB&gt;

    function.json中,设置路由参数startend,即在httpTrigger绑定中添加"route": "start/end",。然后在url中输入时间访问。

    自行获取请求正文和query CosmosDB。

【讨论】:

非常感谢!非常详细但简洁,我可能会选择第三个选项,因为它是最灵活的,但其他两个也非常好,再次感谢!

以上是关于Azure Function App HTTP 触发来自请求正文的 CosmosDB 输入查询的主要内容,如果未能解决你的问题,请参考以下文章

尝试通过 Azure Function App 站点 URL 发布 ZIP 文件失败,HTTP 状态代码未经授权

Azure App Function (Functions 2.x):通过 HTTP 函数在 CosmosDB 中创建新文档

Azure Function App 对 Webhook 的初始响应

如何确定 Webhook 未触发 Azure Function App 的原因

如何使用 node.js 运行时访问 Azure Function App 函数中的 multipart/form-data

将 Microsoft Azure Function App 2.0 预览版绑定到 0.0.0.0