你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:使用 Azure DocumentDB 连接 Node.js Web 应用

在本教程中,将生成连接到 Azure DocumentDB 的 Node.js Web 应用程序。 MongoDB、Express、React.js、Node.js(MERN)堆栈是用于生成许多新式 Web 应用程序的常用技术集合。 使用 Azure DocumentDB,可以生成新的 Web 应用程序,或使用已熟悉的 MongoDB 驱动程序迁移现有应用程序。 在本教程中,你将:

  • 配置你的环境
  • 使用本地 MongoDB 容器测试 MERN 应用程序
  • 使用群集测试 MERN 应用程序
  • 将 MERN 应用程序部署到 Azure 应用服务

先决条件

若要完成本教程,需要以下各资源:

  • 现有的 Azure DocumentDB 群集

  • 具有 GitHub Codespaces 权限的 GitHub 帐户

配置开发环境

开发容器环境已备齐完成此项目中各个练习所需的所有依赖项。 可以在 GitHub Codespaces 中或使用 Visual Studio Code 在本地运行开发容器。

GitHub Codespaces 以 Visual Studio Code for Web 作为用户界面运行 GitHub 托管的开发容器。 对于最直接的开发环境,请使用 GitHub Codespaces,以便预先安装正确的开发人员工具和依赖项来完成此培训模块。

重要

所有 GitHub 帐户每月最多可使用 Codespaces 60 小时,其中包含两个核心实例。

  1. 开始在 main GitHub 存储库的 azure-samples/msdocs-azure-cosmos-db-mongodb-mern-web-app 分支上创建新的 GitHub Codespace 的过程。

    在GitHub Codespaces中打开

  2. 创建 codespace 页上,查看 codespace 配置设置,然后选择 创建新的 codespace

    在创建新代码空间之前,确认屏幕的屏幕截图。

  3. 等待 codespace 启动。 此启动过程可能需要几分钟时间。

  4. 在代码空间中打开一个新终端。

    小窍门

    可以使用主菜单导航到 “终端 ”菜单选项,然后选择“ 新建终端 ”选项。

    用于打开新终端的 devcontainer 菜单选项的屏幕截图。

  5. 检查本教程中使用的工具版本。

    docker --version
    
    node --version
    
    npm --version
    
    az --version
    

    注释

    本教程要求预安装在环境中的每个工具的以下版本:

    Tool 版本
    Docker ≥ 20.10.0
    Node.js ≥ 18.0150
    npm ≥ 9.5.0
    Azure CLI ≥ 2.46.0
  6. 关闭终端。

  7. 本教程中的其余步骤发生在此开发容器的上下文中。

使用 MongoDB 容器测试 MERN 应用程序的 API

首先,使用本地 MongoDB 容器运行示例应用程序的 API,以验证应用程序是否正常工作。

  1. 使用 Docker 运行 MongoDB 容器并发布典型的 MongoDB 端口(27017)。

    docker pull mongo:6.0
    
    docker run --detach --publish 27017:27017 mongo:6.0
    
  2. 在侧栏中,选择 MongoDB 扩展。

    侧栏中 MongoDB 扩展的屏幕截图。

  3. 使用连接字符串 mongodb://localhost向 MongoDB 扩展添加新连接。

    MongoDB 扩展中已添加的连接按钮的屏幕截图。

  4. 连接成功后,打开 data/products.mongodb playground 文件。

  5. 选择“ 运行所有 ”图标以执行脚本。

    MongoDB 扩展操场中“全部运行”按钮的屏幕截图。

  6. 试运行应在本地 MongoDB 集合中生成一个文档列表。 下面是输出的截断示例。

    [
      {
        "_id": { "$oid": "640a146e89286b79b6628eef" },
        "name": "Confira Watch",
        "category": "watches",
        "price": 105
      },
      {
        "_id": { "$oid": "640a146e89286b79b6628ef0" },
        "name": "Diannis Watch",
        "category": "watches",
        "price": 98,
        "sale": true
      },
      ...
    ]
    

    注释

    对象标识符 (_id) 是随机生成的,不同于此截断的示例输出。

  7. 服务器/ 目录中,创建新的 .env 文件。

  8. server/.env 文件中,为此值添加环境变量:

    环境变量 价值
    CONNECTION_STRING Azure DocumentDB 群集的连接字符串。 目前,请使用 mongodb://localhost:27017?directConnection=true
    CONNECTION_STRING=mongodb://localhost:27017?directConnection=true
    
  9. 将终端的上下文更改为 服务器/ 文件夹。

    cd server
    
  10. 从节点包管理器(npm)安装依赖项。

    npm install
    
  11. 启动 Node.js 和 Express 应用程序。

    npm start
    
  12. API 会自动打开浏览器窗口,以验证它是否返回产品文档数组。

  13. 关闭额外的浏览器选项卡/窗口。

  14. 关闭终端。

使用 Azure DocumentDB 群集测试 MERN 应用程序

现在,让我们验证应用程序是否与 Azure DocumentDB 无缝配合工作。 对于此任务,请使用 MongoDB shell 使用种子数据填充预先存在的群集,然后更新 API 的连接字符串。

  1. 登录到 Azure 门户 (https://portal.azure.com)。

  2. 导航到现有的 Azure DocumentDB 群集页。

  3. 在 Azure DocumentDB 群集页中,选择 “连接字符串 导航”菜单选项。

    群集页面上连接字符串选项的屏幕截图。

  4. 记录 连接字符串 字段中的值。

    群集的连接字符串凭据的屏幕截图。

    重要

    门户中的连接字符串不包括用户名和密码值。 必须将 <user><password> 占位符替换为最初创建群集时使用的凭据。

  5. 在集成开发环境(IDE)中打开一个新终端。

  6. 使用前面记录的 mongosh 命令和连接字符串启动 MongoDB Shell。 请确保将 <user><password> 占位符替换为最初创建群集时使用的凭据。

    mongosh "<mongodb-cluster-connection-string>"
    

    注释

    可能需要对连接字符串的特定值进行编码。 在此示例中,群集的名称为 msdocs-azure-documentdb-tutorial,用户名为 clusteradmin,密码为 P@ssw.rd。 在密码中,@字符需要使用%40进行编码。 此处提供了一个示例连接字符串,其中包含密码的正确编码。

    CONNECTION_STRING=mongodb+srv://clusteradmin:P%40ssw.rd@msdocs-azure-documentdb-tutorial.mongocluster.cosmos.azure.com/?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000
    
  7. 在 shell 中运行以下命令,以创建数据库、集合,并初始化数据。

    use('cosmicworks');
    
    db.products.drop();
    
    db.products.insertMany([
      { name: "Confira Watch", category: "watches", price: 105.00 },
      { name: "Diannis Watch", category: "watches", price: 98.00, sale: true },
      { name: "Sterse Gloves", category: "gloves", price: 42.00 },
      { name: "Peache Sunglasses", category: "eyewear", price: 32.00, sale: false, sizes: [ "S", "M", "L" ] },
      { name: "Icento Pack", category: "bags", price: 58.00 },
      { name: "Iroowl Bracelet", category: "watches", price: 66.00 },
      { name: "Glaark Bag", category: "bags", price: 56.00, sale: true },
      { name: "Windry Mittens", category: "gloves", price: 35.00 },
      { name: "Tuvila Hat", category: "hats", price: 120.00 },
      { name: "Klinto Hat", category: "hats", subcategory: "hats-beanies", price: 65.00 }
    ]);
    
    db.products.find({});
    
  8. 这些命令应生成本地 MongoDB 集合中的文档列表。 下面是输出的截断示例。

    [
      {
        "_id": { "$oid": "640a146e89286b79b6628eef" },
        "name": "Confira Watch",
        "category": "watches",
        "price": 105
      },
      {
        "_id": { "$oid": "640a146e89286b79b6628ef0" },
        "name": "Diannis Watch",
        "category": "watches",
        "price": 98,
        "sale": true
      },
      ...
    ]
    

    注释

    对象标识符 (_id) 是随机生成的,不同于此截断的示例输出。

  9. 退出 MongoDB shell。

    exit
    
  10. 客户端/ 目录中,创建新的 .env 文件。

  11. client/.env 文件中,为此值添加环境变量:

    环境变量 价值
    CONNECTION_STRING Azure DocumentDB 群集的连接字符串。 使用与 mongo shell 一起使用的同一连接字符串。
    CONNECTION_STRING=<your-connection-string>
    
  12. 通过将终端的上下文更改为 服务器/ 文件夹、从 Node 包管理器(npm)安装依赖项,然后启动应用程序,验证应用程序是否正在使用数据库服务。

    cd server
    
    npm install
    
    npm start
    
  13. API 会自动打开浏览器窗口,以验证它是否返回产品文档数组。

  14. 关闭额外的浏览器选项卡/窗口。 然后,关闭终端。

将 MERN 应用程序部署到 Azure 应用服务

证明应用程序通过将服务和客户端部署到 Azure 应用服务来端到端工作。 使用 Web 应用中的机密存储带有凭据和 API 终结点的环境变量。

  1. 在集成开发环境(IDE)中,打开一个新终端。

  2. 为名为 resourceGroupName 的预先存在的资源组的名称创建 shell 变量。

    # Variable for resource group name
    resourceGroupName="<existing-resource-group>"
    
  3. 为名为 serverAppNameclientAppName 的两个 Web 应用创建 shell 变量。

    # Variable for randomnly generated suffix
    let suffix=$RANDOM*$RANDOM
    
    # Variable for web app names with a randomnly generated suffix
    serverAppName="server-app-$suffix"
    clientAppName="client-app-$suffix"
    
  4. 如果尚未登录,请使用 az login --use-device-code 命令登录到 Azure CLI。

  5. 将当前工作目录更改为 服务器/ 路径。

    cd server
    
  6. az webapp upMERN 应用程序的服务器组件创建一个新的 Web 应用。

    az webapp up \
        --resource-group $resourceGroupName \
        --name $serverAppName \
        --sku F1 \
        --runtime "NODE|18-lts"
    
  7. 为名为 CONNECTION_STRINGaz webapp config connection-string set 的服务器 Web 应用创建新的连接字符串设置。 对本教程前面的 MongoDB shell 和 .env 文件使用的连接字符串使用相同的值。

    az webapp config connection-string set \
        --resource-group $resourceGroupName \
        --name $serverAppName \
        --connection-string-type custom \
        --settings "CONNECTION_STRING=<mongodb-connection-string>"
    
  8. 获取服务器 Web 应用的 az webapp show URI,并将其存储在 shell 变量名称 d serverUri 中

    serverUri=$(az webapp show \
        --resource-group $resourceGroupName \
        --name $serverAppName \
        --query hostNames[0] \
        --output tsv)
    
  9. 使用 NuGet open-cli 中的npx包和命令,使用服务器 Web 应用的 URI 打开浏览器窗口。 验证服务器应用是否从群集返回 JSON 数组数据。

    npx open-cli "https://$serverUri/products" --yes
    

    小窍门

    有时部署可以异步完成。 如果未看到预期内容,请等待另一分钟并刷新浏览器窗口。

  10. 将工作目录更改为 客户端/ 路径。

    cd ../client
    
  11. 使用 az webapp up.. 为 MERN 应用程序的客户端组件创建新的 Web 应用。

    az webapp up \
        --resource-group $resourceGroupName \
        --name $clientAppName \
        --sku F1 \
        --runtime "NODE|18-lts"
    
  12. 为名为REACT_APP_API_ENDPOINT且带有az webapp config appsettings set的客户端 Web 应用创建新的应用设置。 使用存储在 serverUri shell 变量中的服务器 API 终结点。

    az webapp config appsettings set \
        --resource-group $resourceGroupName \
        --name $clientAppName \
        --settings "REACT_APP_API_ENDPOINT=https://$serverUri"
    
  13. 获取客户端 Web 应用的 az webapp show URI,并将其存储在 shell 变量名称 d clientUri 中

    clientUri=$(az webapp show \
        --resource-group $resourceGroupName \
        --name $clientAppName \
        --query hostNames[0] \
        --output tsv)
    
  14. 使用 NuGet open-cli 中的npx包和命令,使用客户端 Web 应用的 URI 打开浏览器窗口。 验证客户端应用是否正在从服务器应用的 API 呈现数据。

    npx open-cli "https://$clientUri" --yes
    

    小窍门

    有时部署可以异步完成。 如果未看到预期内容,请等待另一分钟并刷新浏览器窗口。

  15. 关闭终端。

清理资源

在自己的订阅中操作时,最好在项目结束时删除不再需要的资源。 持续运行资源可能会产生费用。 可以逐个删除资源,也可以删除资源组以删除整个资源集。

  1. 若要删除整个资源组,请使用 az group delete

    az group delete \
        --name $resourceGroupName \
        --yes
    
  2. 使用 az group list. 验证是否删除了资源组。

    az group list
    

清理开发环境

你可能还希望清理开发环境或将其返回到其典型状态。

删除 GitHub Codespaces 环境可确保可以最大程度地提高帐户获得的每核心免费小时数权利。

  1. 登录到 GitHub Codespaces 仪表板 (https://github.com/codespaces)。

  2. 找到从 azure-samples/msdocs-azure-cosmos-db-mongodb-mern-web-app GitHub 存储库中源的当前正在运行的开发容器。

    所有正在运行的开发容器的屏幕截图,包括其状态和模板。

  3. 打开代码空间的上下文菜单,然后选择 删除

    单个代码空间的上下文菜单的屏幕截图,其中突出显示了“删除”选项。

后续步骤