【问题标题】:What is the correct way to handle multiple HTTP Methods in Azure Functions (NodeJS)在 Azure Functions (NodeJS) 中处理多个 HTTP 方法的正确方法是什么
【发布时间】:2020-05-20 10:05:37
【问题描述】:

在 Azure Functions 中构建应用程序时,您可以指定 function.json 中接受的 HTTP 方法

鉴于您可以在(GET、PUT POST 等)上执行多个功能的 API,创建该功能的最佳方式是什么。

将需要可用的共享逻辑和库,因此我正在寻找一种可以在单个类中启用所有方法的模式,但不确定如何在 function.json 中定义它,这样每个 HTTP 方法都可以有自己的入口点。

另一种选择是创建一个基本上选择该函数的方法和类的函数,但这似乎是一些中间件开销,我确信可以以更好的方式处理。

即我认为我不应该为我为其创建函数的每个对象都这样做,并且必须有更好的模式。

 async HandleRequest(){
        return validateJwt(function(context,req){
            if(req.method === 'GET'){
            }
            else if(req.method === 'POST'){

            }
            else if(req.method === 'DELETE'){

            }
            else if(req.method === 'PUT'){

            }
            else if(req.method === 'PATCH'){

            }
        });
    }

【问题讨论】:

    标签: node.js http azure-functions http-method


    【解决方案1】:

    所以最好的方法是使用多个函数。

    你可以在function.json文件中通过路由和方法来定义函数。 看例子。

    注意route:family/{id:int} 这是此函数将处理的唯一路由。您还输入了 "methods": ["get"] 以将函数限制为 GET。

    根据 METHOD 创建一个函数,以提高代码的可维护性。然后,我使用一些中间件功能(执行身份验证和错误处理),然后我有一个通用的 FamilyHandler 类来执行 CRUD 操作,包括管理与数据库的连接。

    {
      "bindings": [
        {
          "authLevel": "anonymous",
          "type": "httpTrigger",
          "direction": "in",
          "name": "req",
          "methods": ["get"],
          "route": "family/{id:int}"
        },
        {
          "type": "http",
          "direction": "out",
          "name": "res"
        }
      ]
    }
    

    我在以下文档中发现了这一点 https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-http-webhook-trigger?tabs=javascript

    【讨论】:

    • 我认为这只是一个例子......函数不会限制你,你不必每个函数只允许一个方法。进入函数后在代码中处理不同的请求是完全可行的。
    • 正确,但它非常难以维护。这个问题的目的是找到最好的方法来做到这一点。我相信这是目前最好的方式,而不是唯一的方式。我的代码中有 if 语句,而且它变得很长,特别是对于要检索和保存的多个对象。现在我有了遵循单一职责原则的非常简洁的源文件。
    • 好的...如果这个问题已经结束,你可以将自己的答案标记为这个问题的答案。:)
    【解决方案2】:

    你的 function.json 应该是这样的:

    {
      "bindings": [
        {
          "authLevel": "function",
          "type": "httpTrigger",
          "direction": "in",
          "name": "req"
        },
        {
          "type": "http",
          "direction": "out",
          "name": "res"
        }
      ]
    }
    

    默认情况下,如果未指定方法,则该函数接受所有方法。

    【讨论】:

    • 正确,但是我应该创建一个 Function pre 方法(并在绑定中指定它)还是使用上面列出的代码来决定每个 HTTP 方法要做什么。
    • @Bluephlame 是的,你是对的。如果有多种类型的方法映射到函数,则必须在代码中添加逻辑进行处理。您在问题中显示的代码是正确的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2011-11-29
    • 2021-10-30
    • 2020-12-02
    • 2020-09-23
    相关资源
    最近更新 更多