Overview
在本教程中,您将创建一个HTTP触发的Azure Function,该函数使用MongoDB Node.js驾驶员从MongoDB Atlas查询数据。您还将学习;了解如何在无服务器环境中管理数据库连接,以及如何将函数部署到Azure云。
先决条件
开始之前,请完成以下步骤:
部署MongoDB Atlas 群集,配置网络访问权限和数据库用户,并加载示例数据集。要学习;了解操作方法,请参阅 MongoDB入门指南。
安装 Node.js 版本18 或更高版本。
Tutorial
本教程将指导您完成以下步骤:
创建Azure云资源。
初始化本地项目。
安装MongoDB Node.js驾驶员。
配置与
sample_mflix数据库的数据库连接。编写一个函数来查询
sample_mflix.movies集合并检索表示电影的文档。在本地测试函数。
部署到Azure。
创建Azure云资源。
运行以下命令创建资源群组,将 替换为您的群组名称,并将<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>
初始化本地项目。
运行以下命令以初始化本地 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文件。
配置数据库连接。
打开 src/functions/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文件中:
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文档中的配置连接字符串。
编写一个函数来查询MongoDB。
在 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 响应。
部署到Azure。
通过运行以下命令在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 中的访问权限密钥文档。
了解详情
要学习;了解有关本教程所涵盖概念的更多信息,请参阅以下资源:
请参阅Atlas文档中的使用Azure Functions 管理连接,学习;了解连接最佳实践
请参阅Azure Functions 文档,学习;了解有关 Functions 的更多信息