Azure CosmosDB - HttpTrigger - javascript - 如何使端点正常而不是像 {partitionKeyValue} 和 {id} 那样重复

问题描述 投票:0回答:1

我正在按照pluralsight创建-HTTP触发器,从路由数据中查找ID 该课程有点过时,因此无法按预期工作。 (示例端点可读,但在新版本中不起作用)

我按照 Microsoft 文档并使用新版本执行相同操作

https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-cosmosdb-v2-input?tabs=python-v2%2Cisolated-process%2Cnodejs-v4%2Cextensionv4&pivots=programming-语言-javascript#http-trigger-look-up-id-from-route-data-javascript

const { app, input } = require('@azure/functions');

const cosmosInput = input.cosmosDB({
    databaseName: 'ToDoItems',
    collectionName: 'Items',
    id: '{id}',
    partitionKey: '{partitionKeyValue}',
    connectionStringSetting: 'CosmosDBConnection',
});

app.http('httpTrigger1', {
    methods: ['GET', 'POST'],
    authLevel: 'anonymous',
    route: 'todoitems/{partitionKeyValue}/{id}',
    extraInputs: [cosmosInput],
    handler: (request, context) => {
        const toDoItem = context.extraInputs.get(cosmosInput);
        if (!toDoItem) {
            return {
                status: 404,
                body: 'ToDo item not found',
            };
        } else {
            return {
                body: `Found ToDo item, Description=${toDoItem.Description}`,
            };
        }
    },
});

当然文档中有错误(connectionStringSetting和collectionName应该是connection和containerName)

但调用如下

调用WebRequest http://localhost:7071/api/todo/2/2

关于我的 Cosmos 模拟器 - 容器指定分区键为 = /id

上面的网址对我来说看起来不太好,重复的路径。

我必须使用partitionkey,我必须使用id。所以我不确定如何使端点变得更好。 像http://localhost:7071/api/todo/2

请指教

azure azure-functions azure-cosmosdb azure-http-trigger
1个回答
0
投票

MSDOC中所述,对于分区容器,必须传递分区键。

当集合被分区时,查找操作还必须指定分区键值。

enter image description here

为了避免在路线中使用重复的 Id分区键 值,请按照以下步骤操作:

  • 在门户中创建容器时,手动在 partitionkey 中定义一些随机值。

enter image description here

  • 将值定义为上传到容器的 Json 文件中的 partitionkey

示例:

  • 我的 Json 文件:
{
    "id":"1",
    "key":"2",
    "Description":"Hello World"
}  
  • 将文件上传到 Cosmos 容器。

这会生成具有上传的 Json 文件中定义的 id 和 key 的新项目。

enter image description here

代码片段:

const { app, input } = require('@azure/functions');

const cosmosInput = input.cosmosDB({
    databaseName: 'db1',
    containerName: 'container1',
    id: '{id}',
    partitionKey: '{partitionKeyValue}',
    connection: 'CosmosDBConnection'
});

app.http('httpTrigger1', {
    methods: ['GET', 'POST'],
    authLevel: 'anonymous',
    route: 'Items/{partitionKeyValue}/{id}',
    extraInputs: [cosmosInput],
    handler: (request, context) => {
        const toDoItem = context.extraInputs.get(cosmosInput);
        if (!toDoItem) {
            return {
                status: 404,
                body: 'Item not found',
            };
        } else {
            return {
                body: `Found Item, Description=${toDoItem.Description}`,
            };
        }
    },
});

控制台响应:

[2024-04-22T11:56:37.019Z] Worker process started and initialized.

Functions:

        httpTrigger1: [GET,POST] http://localhost:7071/api/Items/{partitionKeyValue}/{id}

For detailed output, run func with --verbose flag.
[2024-04-22T11:56:59.194Z] Executing 'Functions.httpTrigger1' (Reason='This function was programmatically called via the host APIs.', Id=d8fdefe9-5643-4c5e-b32d-44f353e75fd2)
[2024-04-22T11:57:03.143Z] Executed 'Functions.httpTrigger1' (Succeeded, Id=d8fdefe9-5643-4c5e-b32d-44f353e75fd2, Duration=4028ms)

输出:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.