使用 Azure Cosmos DB 的 API for MongoDB 创建 Angular 应用 - 使用 Mongoose 连接到 Azure Cosmos DB

适用对象: MongoDB

本教程包含多个部分,演示了如何通过 Express 和 Angular 创建 Node.js 应用,并将其连接到使用 Azure Cosmos DB 的 API for MongoDB 配置的 Azure Cosmos DB 帐户。 本文是教程的第 5 部分,内容基于第 4 部分

本教程的此部分介绍如何:

  • 使用 Mongoose 连接到 Azure Cosmos DB。
  • 获取 Azure Cosmos DB 连接字符串。
  • 创建 Hero 模型。
  • 创建 Hero 服务用于获取 Hero 数据。
  • 在本地运行应用。

如果没有 Azure 订阅,请在开始前创建试用版订阅

先决条件

  • 开始本教程之前,请先完成第 4 部分中的步骤。

  • 本教程要求在本地运行 Azure CLI。 必须安装 Azure CLI 2.0 或更高版本。 运行 az --version 即可查找版本。 如果需要安装或升级 Azure CLI,请参阅安装 Azure CLI 2.0

  • 本教程介绍生成应用程序的各个步骤。 若要下载完成的项目,可从 GitHub 上的 angular-cosmosdb 存储库获取完成的应用程序。

使用 Mongoose 进行连接

Mongoose 是适用于 MongoDB 和 Node.js 的对象数据建模 (ODM) 库。 可以使用 Mongoose 连接到 Azure Cosmos DB 帐户。 使用以下步骤安装 Mongoose 并连接到 Azure Cosmos DB:

  1. 安装 Mongoose NPM 模块 - 用来与 MongoDB 通信的 API。

    npm install mongoose@5.13.15 --save
    

    重要

    Azure Cosmos DB for MongoDB 与 Mongoose 5.13.15 及更低版本兼容。 有关详细信息,请参阅 Mongoose GitHub 存储库中的问题讨论

  2. server 文件夹中,创建名为 mongo.js 的文件。 将 Azure Cosmos DB 帐户的连接详细信息添加到此文件。

  3. 将以下代码复制到 mongo.js 文件中。 该代码提供以下功能:

    • 需要 Mongoose。

    • 替代 Mongo 约定,以使用 ES6/ES2015 和更高版本中内置的基本约定。

    • 根据是在过渡、生产还是开发环境中操作,针对 env 文件发出调用以设置某些项目。 将在下一部分创建该文件。

    • 请包含 env 文件中设置的 MongoDB 连接字符串。

    • 创建调用 Mongoose 的 connect 函数。

      const mongoose = require('mongoose');
      /**
      * Set to Node.js native promises
      * Per https://mongoosejs.com/docs/promises.html
      */
      mongoose.Promise = global.Promise;
      
      const env = require('./env/environment');
      
      // eslint-disable-next-line max-len
      const mongoUri = `mongodb://${env.accountName}:${env.key}@${env.accountName}.documents.azure.cn:${env.port}/${env.databaseName}?ssl=true`;
      
      function connect() {
      mongoose.set('debug', true);
      return mongoose.connect(mongoUri, { useMongoClient: true });
      }
      
      module.exports = {
      connect,
      mongoose
      };
      
  4. 在“资源管理器”窗格中的“server”下,创建名为 environment 的文件夹。 在 environment 文件夹中创建名为 environment.js 的文件。

  5. 在 mongo.js 文件中,需要包含 dbNamekeycosmosPort 参数的值。 将以下代码复制到 environment.js 文件中:

    // TODO: replace if yours are different
    module.exports = {
      accountName: 'your-cosmosdb-account-name-goes-here',
      databaseName: 'admin', 
      key: 'your-key-goes-here',
      port: 10255
    };
    

获取连接字符串

若要将应用程序连接到 Azure Cosmos DB,需要更新应用程序的配置设置。 使用以下步骤更新设置:

  1. 在 Azure 门户中,获取端口号、Azure Cosmos DB 帐户名,以及 Azure Cosmos DB 帐户的主密钥值。

  2. environment.js 文件中,将 port 的值更改为 10255。

    const port = 10255;
    
  3. environment.js 文件中,将 accountName 的值更改为在本教程步骤 4 中创建的 Azure Cosmos DB 帐户的名称。

  4. 在 Terminal 窗口中使用以下 CLI 命令,检索 Azure Cosmos DB 帐户的主密钥:

    az cosmosdb list-keys --name <cosmosdb-name> -g myResourceGroup
    

    你在本教程第 4 部分中创建的 Azure Cosmos DB 帐户名为 <cosmosdb-name>。

  5. 将主密钥作为 key 值复制到“environment.js”文件中。

现在,应用程序拥有了连接到 Azure Cosmos DB 所需的所有必要信息。

创建 Hero 模型

接下来,你需要通过定义模型文件来定义要存储在 Azure Cosmos DB 中的数据的架构。 使用以下步骤创建一个定义数据架构的 Hero 模型:

  1. 在“资源管理器”窗格的“服务器”文件夹下,创建一个名为“hero.model.js”的文件 。

  2. 将以下代码复制到“hero.model.js”文件中。 该代码提供以下功能:

    • 需要 Mongoose。
    • 使用 ID、name 和 saying 创建新架构。
    • 通过使用该架构创建模型。
    • 导出模型。
    • 将集合命名为“Heroes”而不是“Heros”(根据 Mongoose 复数形式命名规则,后者为集合的默认名称) 。
    const mongoose = require('mongoose');
    
    const Schema = mongoose.Schema;
    
    const heroSchema = new Schema(
      {
        id: { type: Number, required: true, unique: true },
        name: String,
        saying: String
      },
      {
        collection: 'Heroes'
      }
    );
    
    const Hero = mongoose.model('Hero', heroSchema);
    
    module.exports = Hero;
    

创建 Hero 服务

创建 Hero 模型后,需要定义一个服务用于读取数据,以及执行 list、create、delete 和 update 操作。 使用以下步骤创建一个 Hero 服务用于查询 Azure Cosmos DB 中的数据:

  1. 在“资源管理器”窗格中的“server”文件夹下,创建名为 hero.service.js 的文件。

  2. 将以下代码复制到 hero.service.js 文件中。 该代码提供以下功能:

    • 获取创建的模型。
    • 连接到数据库。
    • 创建 docquery 变量,以便使用 hero.find 方法定义一个返回所有 Hero 的查询。
    • 结合 docquery.exec 函数运行查询。该函数中的约定可以获取响应状态为 200 的所有 Hero 的列表。
    • 如果状态为 500,则发回错误消息。
    • 由于使用的是模块,因此可以获取 Hero。
    const Hero = require('./hero.model');
    
    require('./mongo').connect();
    
    function getHeroes() {
      const docquery = Hero.find({});
      docquery
        .exec()
        .then(heroes => {
          res.status(200).json(heroes);
        })
        .catch(error => {
          res.status(500).send(error);
          return;
        });
    }
    
    module.exports = {
      getHeroes
    };
    

配置路由

接下来,需要设置路由用于处理 get、create、read 和 delete 请求的 URL。 路由方法指定回调函数(也称为“处理程序函数”)。 当应用程序接收到发往指定终结点和 HTTP 方法的请求时,会调用这些函数。 使用以下步骤添加 Hero 服务并定义路由:

  1. 在 Visual Studio Code 中的 routes.js 文件内,注释掉发送示例 Hero 数据的 res.send 函数。 添加一行代码,以改为调用 heroService.getHeroes 函数。

    router.get('/heroes', (req, res) => {
      heroService.getHeroes(req, res);
    //  res.send(200, [
    //      {"id": 10, "name": "Starlord", "saying": "oh yeah"}
    //  ])
    });
    
  2. routes.js 文件中,为 Hero 服务添加 require 语句:

    const heroService = require('./hero.service'); 
    
  3. hero.service.js 文件中更新 getHeroes 函数,以采用 reqres 参数,如下所示:

    function getHeroes(req, res) {
    

请花点时间查看并演练上面的代码。 首先查看 index.js 文件,此文件用于设置节点服务器。 可以看到,其中设置并定义了路由。 接下来,routes.js 文件与 Hero 服务通信,要求该服务获取 getHeroes 之类的函数,并传递请求和响应。 hero.service.js 文件获取模型并连接到 Mongo。 然后,此文件执行调用的 getHeroes,并返回响应 200。

运行应用

接下来,请使用以下步骤运行应用:

  1. 在 Visual Studio Code 中保存所有更改。 在左侧,选择“调试”按钮 ,然后选择“启动调试”按钮

  2. 现在切换到浏览器。 打开“开发人员工具”和“网络”选项卡。 转到 http://localhost:3000,其中显示了我们的应用程序。

    New Azure Cosmos DB account in the Azure portal

尚无 Hero 存储在该应用中。 在本教程的下一部分,我们将添加放置、推送和删除功能。 然后,便可以使用与 Azure Cosmos DB 数据库的 Mongoose 连接,在 UI 中添加、更新和删除 hero。

清理资源

不再需要本教程中创建的资源时,可以删除相应的资源组、Azure Cosmos DB 帐户和所有相关资源。 使用以下步骤删除资源组:

  1. 转到在其中创建了 Azure Cosmos DB 帐户的资源组。
  2. 选择“删除资源组”。
  3. 确认要删除的资源组的名称,然后选择“删除”。

后续步骤

请转到本教程的第 6 部分,了解如何向应用添加 Post、Put 和 Delete 函数:

尝试为迁移到 Azure Cosmos DB 进行容量规划? 可以使用有关现有数据库群集的信息进行容量规划。