发布于 2026-01-06 6 阅读
0

使用 Azure Functions、Node、JSON 和 Azure SQL 的无服务器 REST API 指南,KISS Azure Function 和繁琐的“嘿,它不起作用!”。好了,列和行就到此为止。结论:AWS 安全直播!

使用 Azure Functions、Node、JSON 和 Azure SQL 构建无服务器 REST API

KISS 的秘诀

Azure 函数和繁琐

嘿,这行不通!

好了,关于列和行就说到这里吧

结论

AWS 安全直播!

对于全栈和后端开发人员来说,Javascript / Typescript(以及 Node)是创建可扩展、优雅、高性能 REST API 的最常用选择之一,这些 API 可供各种各样的客户使用。

Azure Functions 是另一个非常流行的解决方案,开发人员可以利用它创建可扩展的解决方案,而无需处理所有基础架构方面的难题,因为它允许您编写自己的函数,部署它,然后……就完成了!无需配置和监控 IIS 或 Apache,无需费心设置、配置和维护负载均衡集群……只有纯粹的编码乐趣!

作为一名开发者,我非常希望能够将 Node 和 Azure Functions 与我选择的数据库配合使用,正如您可能已经猜到的,我选择的是 Azure SQL。我已经详细解释过(例如,这里这里)为什么我认为 Azure SQL 是完美的云端数据库,所以我决定尝试仅使用 Azure Functions、Azure SQL 和 Node 创建一个 REST 端点。

我刚开始学习Node.js不久,所以我想分享一下我的经验,或许能帮助到和我一样的人。开始吧!

KISS 的秘诀

我非常想遵循KISS原则(Keep It Simple, Stupid,保持简单),所以我决定避免使用任何额外的库,直接选择Tedious——目前最广泛使用的SQL Server/Azure SQL Node包。我还希望尽可能以对JavaScript友好的方式完成所有操作,这意味着直接操作对象和JSON,而不是SQL语句或其他任何会让我意识到底层运行的是(后)关系型数据库的东西。从这个角度来看,NoSQL数据库通常能提供良好的用户体验,因为所有数据都已经是JSON格式,所以操作数据时基本上不需要任何特殊操作。

你发送JSON,你就会收到JSON,就这么简单

使用 Azure SQL 也可以实现这一点,而且除此之外,您还将获得 Azure SQL 提供的所有额外好处。

Azure 函数和繁琐

首先,您需要创建一个 Azure 函数,这可以使用Azure 函数 CLI轻松完成。请确保已安装 Azure 函数 CLI,然后运行以下命令。

func init --worker-runtime node --language javascript
Enter fullscreen mode Exit fullscreen mode

在一个空文件夹中(该文件夹将用作 Azure 函数的工作文件夹)。然后添加一个新函数。

func new --template HttpTrigger --name customer
Enter fullscreen mode Exit fullscreen mode

现在一切就绪,可以使用了,您只需运行以下命令即可在本地启动 Azure 函数运行时。

func start
Enter fullscreen mode Exit fullscreen mode

Azure 函数将开始监听localhost,您现在就可以通过发出 GET 请求来使用创建的 REST 终结点,例如,在以下地址:

http://localhost:7071/api/customer
Enter fullscreen mode Exit fullscreen mode

您可以使用 cURL 或Insomnia等 REST 客户端(或者您喜欢的其他客户端)。目前 REST 端点功能有限,您仍然需要将其连接到 Azure SQL。为此,您需要安装 Tedious 包(请确保您位于 创建 Azure 函数的文件夹中,您也可以在该文件夹中找到host.json文件)。

npm install tedious    
Enter fullscreen mode Exit fullscreen mode

一切就绪。现在你可以打开你喜欢的编辑器(我这里用的是 Visual Studio 或 Visual Studio Code),开始创建一个 REST 端点,用于处理 HTTP 请求,从而为我们的示例客户端点实现 CRUD 操作。Tedious 的使用方法非常简单,而且它的网站上也有相当不错的文档,所以我就不赘述了;你只需要遵循通常的模式即可:

  • Connection通过对象连接到 Azure SQL
  • Request通过对象执行命令
  • 使用结果集

嘿,这行不通!

现在,这里只有一个问题。如果您尝试将 Tedious 与默认的 Azure 函数模板一起使用,该模板如下所示:

module.exports = async function (context, req)
{
    /*
     * Business Logic here
     */
    responseMessage = { customerId: 123, name: "Davide" }

    context.res = {       
        body: responseMessage
    };
}
Enter fullscreen mode Exit fullscreen mode

这行不通。更糟糕的是,它虽然不会报错,但你永远不会得到结果

据我(由于我对这方面了解有限)的理解,原因在于 Tedious 不支持 async/await 模式,而 Azure Functions 默认使用这种模式。解决方案是async从函数定义中移除 `await` 关键字,然后context通过在 Azure Function 运行时提供的对象中设置响应,确保正确发送 HTTP 响应。HTTP 响应准备就绪后,context.done()需要调用 ` get_ ...

Azure Functions JavaScript 开发人员指南:context.done 方法

以下是实现该功能所需的伪代码(完整的可运行代码也已上传至 GitHub 仓库,请继续阅读)。

define Connection object
define Request object
  if Request fails 
    set HTTP status to 500
  once Request is done
    put Request result into context.res
  call context.done()
open Connection
  if Connection fails 
    set HTTP status to 500
    call context.done()
  else
    execute Request
Enter fullscreen mode Exit fullscreen mode

一旦你明白了这一点,就很容易了。

好了,关于列和行就说到这里吧

正如开头所述,作为一名开发人员,我感觉操作 JSON 对象比操作带有列和行的表格要得心应手,所以我很希望能够从 Azure SQL 获取 JSON 数据并将其返回到数据库。得益于 Azure SQL 原生的 JSON 支持,我可以做到这一点。例如,要返回一个包含所有客户的 JSON 数组(作为 HTTP GET 请求的结果),我只需这样做:

SELECT 
    [CustomerID] AS 'Id', 
    [CustomerName] AS 'Name'
FROM 
    [Sales].[Customers] 
FOR JSON PATH
Enter fullscreen mode Exit fullscreen mode

结果大概是这样的:

[
    {
        "Id": 832,
        "Name": "Aakriti Byrraju"
    },
    {
        "Id": 836,
        "Name": "Abel Spirlea"
    },
    {...}
]
Enter fullscreen mode Exit fullscreen mode

这对于从 Azure SQL接收JSON 数据非常有用。但是,如果要发送JSON 数据并将其存储到现有表中呢?方法和之前一样简单。假设这是您要发送到 Azure SQL 的 JSON 数据:

{
    "CustomerName": "John Doe",
    "PhoneNumber": "123-234-5678",
    "FaxNumber": "123-234-5678",
    "WebsiteURL": "http://www.something.com",
    "Delivery": {
        "AddressLine1": "One Microsoft Way",
        "PostalCode": 98052
    }
}
Enter fullscreen mode Exit fullscreen mode

那么,您可以使用以下 T-SQL 代码将 JSON 转换为可轻松插入现有结构的表格:

SELECT 
    * 
FROM
    OPENJSON(@Json) WITH
    (       
        [CustomerName] NVARCHAR(100), 
        [PhoneNumber] NVARCHAR(20), 
        [FaxNumber] NVARCHAR(20), 
        [WebsiteURL] NVARCHAR(256),
        [DeliveryAddressLine1] NVARCHAR(60) '$.Delivery.AddressLine1',
        [DeliveryAddressLine2] NVARCHAR(60) '$.Delivery.AddressLine2',
        [DeliveryPostalCode] NVARCHAR(10) '$.Delivery.PostalCode'   
    )
Enter fullscreen mode Exit fullscreen mode

就是这样!

这样,我们就可以针对每种语言和工具使用最方便或最合适的结构。例如,JavaScript 使用 JSON,SQL 使用表格。

当然,如果您愿意,也可以直接存储 JSON 数据,无需将其转换为表,但这效率会较低。根据您的需求和目标,选择最适合您的方案。如果您决定直接存储 JSON 数据,请记住您还可以为 JSON 文档创建索引。如果您不确定哪种策略最适合您的场景——JSON 还是表——本文一定能帮助您做出决定:《Azure SQL 数据库中的 JSON?让我们来比较一下几种方案!》

结论

由于 JSON 作为连接 Node 和 Azure SQL这两个不同世界的桥梁,将 Node 与 Azure SQL 结合使用从未如此简单。阻抗不匹配的时代终于一去不复返了。现在是时候充分利用 Node 和 Azure SQL 这两项卓越的技术了。

借助 Azure SQL,您可以拥有行级安全性、更改跟踪、加密、列存储、无锁表等等……所有这些都可以通过 JSON 集成使用。

您可以自行测试,只需将此处提供的代码部署到 Azure 即可:

使用 Azure Functions、Node 和 Azure SQL 创建 REST API GitHub 代码库

玩得开心!

文章来源:https://dev.to/azure/serverless-rest-api-with-azure-functions-node-json-and-azure-sql-35f2