Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs 菜单
Docs 主页
/ /

教程:将MongoDB与Azure Functions 结合使用

在本教程中,您将创建一个HTTP触发的Azure Function,该函数使用MongoDB Node.js驾驶员从MongoDB Atlas查询数据。您还将学习;了解如何在无服务器环境中管理数据库连接,以及如何将函数部署到Azure云。

开始之前,请完成以下步骤:

  • 部署MongoDB Atlas 群集,配置网络访问权限和数据库用户,并加载示例数据集。要学习;了解操作方法,请参阅 MongoDB入门指南。

  • 安装并配置Azure CLI。

  • 安装和配置Azure Functions Core Tools。

  • 安装 Node.js 版本18 或更高版本。

本教程将指导您完成以下步骤:

  • 创建Azure云资源。

  • 初始化本地项目。

  • 安装MongoDB Node.js驾驶员。

  • 配置与 sample_mflix数据库的数据库连接。

  • 编写一个函数来查询sample_mflix.movies集合并检索表示电影的文档。

  • 在本地测试函数。

  • 部署到Azure。

1

运行以下命令创建资源群组,将 替换为您的群组名称,并将<GROUP_NAME> <AZURE_REGION>替换为支持的Azure地区:

az group create \
--name <GROUP_NAME> \
--location <AZURE_REGION>

(可选)如果您是首次使用Azure ,则可能需要运行以下命令来注册 Functions资源提供商:

az provider register --namespace Microsoft.Storage
az provider register --namespace Microsoft.Web

然后运行以下命令,创建存储帐户。使用前面代码中的相同地区和群组名称,并为存储帐户提供唯一名称,用此唯一名称替换 <STORAGE_NAME> 占位符:

az storage account create \
--name <STORAGE_NAME> \
--location <AZURE_REGION> \
--resource-group <GROUP_NAME> \
--sku Standard_LRS

最后,运行以下命令以创建 Function应用:

az functionapp create \
--resource-group <GROUP_NAME> \
--consumption-plan-location <AZURE_REGION> \
--runtime node \
--functions-version 4 \
--name <APP_NAME> \
--storage-account <STORAGE_NAME>
2

运行以下命令以初始化本地 Function项目:

func init MongoExample

出现提示时,选择 node 作为工作线程运行时,并选择 javascript 作为语言。

运行以下命令,导航到项目目录并创建新的HTTP触发函数:

cd MongoExample
func new --name GetMovies --template "HTTP trigger"

该命令会创建 src/functions/GetMovies.js文件,您将在后续步骤中编辑该文件。

要将本地项目链接到Azure Function应用,请从项目目录运行以下命令:

func azure functionapp fetch-app-settings <APP_NAME>

此命令从Azure下载所有应用程序设置(包括存储帐户配置),并填充项目的 local.settings.json文件。

3

从项目的根目录运行以下命令以安装MongoDB Node.js驾驶员:

npm install mongodb

此命令将驾驶员添加到项目中并将其记录在 package.json 中,以便在部署时使用驾驶员。

4

打开 src/functions/GetMovies.js 并将其内容替换为以下代码:

GetMovies.js
const { app } = require("@azure/functions");
const { MongoClient } = require("mongodb");
const mongoClient = new MongoClient(
process.env.MONGODB_ATLAS_URI
);
app.http("GetMovies", {
methods: ["GET"],
authLevel: "anonymous",
handler: async (request, context) => {
// Query logic added in the next step
}
});

提示

在处理程序函数外部定义 mongoClient,以跨调用重复使用现有连接。如果在处理程序内创建新连接,则每次调用都会打开一个新连接,并且存在耗尽数据库支持的最大并发连接数的风险。在模块级别定义客户端使连接计数与流量成正比。

根据您的 Node.js 版本,当您尝试连接到MongoDB时,可能会遇到与 DNS 解析相关的错误。如果发生这种情况,请在创建 MongoClient实例之前将以下代码添加到您的 src/functions/GetMovies.js文件中:

GetMovies.js
const { app } = require("@azure/functions");
const { MongoClient } = require("mongodb");
// Forces DNS servers explicitly before connecting to MongoDB
require("node:dns/promises").setServers(["1.1.1.1", "8.8.8.8"]);
const mongoClient = new MongoClient(
process.env.MONGODB_ATLAS_URI
);
app.http("GetMovies", {
methods: ["GET"],
authLevel: "anonymous",
handler: async (request, context) => {
// Query logic added in the next step
}
});

打开 local.settings.json 并将以下字段添加到 Values对象,用实际值替换每个占位符:

{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "<storage-connection-string>",
"FUNCTIONS_WORKER_RUNTIME": "node",
"MONGODB_ATLAS_URI": "<atlas-connection-string>",
"MONGODB_ATLAS_DATABASE": "sample_mflix",
"MONGODB_ATLAS_COLLECTION": "movies"
},
"ConnectionStrings": {}
}

要检索MongoDB Atlas连接字符串,请导航到Atlas仪表盘,选择您的集群,然后单击Connect 。要学习;了解如何检索Azure存储连接字符串,请参阅Azure文档中的配置连接字符串。

5

src/functions/GetMovies.js 中,将处理程序内的 // Query logic added in the next step 注释替换为以下代码:

try {
const database = mongoClient.db(
process.env.MONGODB_ATLAS_DATABASE
);
const collection = database.collection(
process.env.MONGODB_ATLAS_COLLECTION
);
const results = await collection
.find({})
.limit(10)
.toArray();
return { jsonBody: results };
} catch (error) {
return {
status: 500,
jsonBody: { message: "Internal server error." }
};
}

当该函数收到请求时,它会连接到环境变量指定的数据库和集合,并最多返回 10 个文档。如果发生错误,该函数将返回包含错误消息的 500 响应。

6

从项目的根目录运行以下命令以启动函数:

func start

服务器启动时, CLI会显示函数的本地URL 。在浏览器中导航到 http://localhost:7071/api/GetMovies,或使用 cURL 或 Postman 等工具发送请求。

注意

如果服务器启动但无法检索数据,请验证您的本地IP解决是否包含在Atlas网络访问权限列表中。在本地测试时,为生产配置的Azure数据中心IP规则不应用。有关详细信息,请参阅配置IP访问列表条目。

7

通过运行以下命令在Azure中设置环境变量,并将每个占位符替换为实际值:

az functionapp config appsettings set \
--name <APP_NAME> \
--resource-group <GROUP_NAME> \
--settings MONGODB_ATLAS_URI=<atlas-connection-string>
az functionapp config appsettings set \
--name <APP_NAME> \
--resource-group <GROUP_NAME> \
--settings MONGODB_ATLAS_DATABASE=sample_mflix
az functionapp config appsettings set \
--name <APP_NAME> \
--resource-group <GROUP_NAME> \
--settings MONGODB_ATLAS_COLLECTION=movies

通过运行以下命令来部署函数:

func azure functionapp publish <APP_NAME>
Deployment successful.
Remote build succeeded!
Syncing triggers...
Functions in <APP_NAME>:
GetMovies - [httpTrigger]
Invoke url: https://<APP_NAME>.azurewebsites.net/api/getmovies

部署完成后, CLI会显示函数的公共URL 。由于该函数使用 authLevel: "anonymous",因此无需密钥即可访问。

注意

对于生产部署,请考虑将authLevel 更改为"function""admin" ,然后将相应的密钥分发给授权客户端。要学习;了解详情,请参阅使用Azure Functions 中的访问权限密钥文档。

要学习;了解有关本教程所涵盖概念的更多信息,请参阅以下资源:

后退

在 Vercel 上部署应用程序

在此页面上