2018 年 6 月

磁碟區 33 編號 6

本文章是由機器翻譯。

資料點-過於笨重 API 取代 Azure 函式

Julie Lerman |2018 年 6 月

程式碼下載位於msdn.com/magazine/0618magcode

回於 2015年與 2016年,我撰寫幾個資料行有關使用 Azure DocumentDB 或 Node.js Web API。發生許多相關。即使我設計 DocumentDB Node.js SDK 的優點,我仍然需要撰寫大量的邏輯。時發生邏輯建立 DocumentDB 帳戶、 資料庫以及集合所表示的物件。發生程式碼來建立查詢,並執行它們,圖層的非同步呼叫。但我能夠寫入允許我的應用程式來建立、 查詢和更新資料庫中的資料很少 API。

在較新的資料行,我曾 Azure 函式,Microsoft 的無伺服器 Api 駐留在 Azure 中,且與其他 Azure 技術緊密整合。其中一個這些整合是以 Azure Cosmos DB 哪些 Azure DocumentDB,最後發展成的資料存放區。

我需要寫入一些 Azure 函式,將它們整合以 Cosmos DB 來讀取和寫入資料,查看我舊版的 Node.js Api 並無法藉由將它們轉換成 Azure 函式排除大約 98%的程式碼,才能實現。這是因為大部分的 [我已撰寫的程式碼是與資料庫互動,但現在 Azure 函式處理的所有工作。僅有識別的連接字串設定 — 是否來自資料庫或移到其中的資料 — 和相關的查詢中,內建函式的功能會負責的其餘部分。

使用 Visual Studio 程式碼和擴充功能

在舊版的 Azure 函式資料行,我曾經工作直接在 Azure 入口網站中。但是,也可以使用 Azure 函式核心工具來開發您的電腦上,然後再部署到 Azure。工具 (第 1 版) 的第一個版本只會在執行 Windows,包含.NET 4.7.1 或更高版本,而且沒有使用這些工具的 Visual Studio 2017 延伸模組。

相反地,第 2 版的 Azure 功能的核心工具.NET Core 上執行,而且是跨平台和 Visual Studio Code 擴充功能可讓您使用它有效 (bit.ly/2H7VmxH)。這是我將使用本文章中的版本。請注意,這些工具和擴充功能處於預覽狀態。

使用此擴充功能有少數的安裝需求,您會發現在讀我 for Visual Studio Code 擴充功能。而且假設您已經安裝 Visual Studio 程式碼和其先決條件上您的系統,可能是 Windows macOS 或 Linux。

副檔名可以幫助您輕鬆地建立新的 Azure 函式應用程式資料夾,包含 Azure 函式,建立函式 (具有各種不同的範本,可從中選擇),來執行和偵錯在本機,並將其部署至 Azure。我已經真的印象因為花費離開的困難工作,而且您只需要專注於您的程式碼,也就是無伺服器運算的承諾。

除了 Azure 函式延伸模組中,我也已安裝 Azure Cosmos DB 延伸模組的 Visual Studio 程式碼 (bit.ly/2HkPfDE)。我要查看的集合和文件的現有的資料庫中,使用,但您也可以使用擴充功能來建立新 Cosmos DB 帳戶、 資料庫與集合,以及擷取和更新的文件並建立新文件。我可以匯入指定預先存在的 JSON 檔案的文件的建議中,並希望看到裡面吧。

務必使用這些擴充功能是能夠登入您的 Azure 帳戶,從 Visual Studio 程式碼中,我也已安裝的 Azure 帳戶延伸模組 (bit.ly/2k1phdp)。

每個這些三個擴充功能具有實用的逐步解說在我已連結到頁面中,這將會幫助您開始加以使用。我輸入淺逐步解說,這裡用於顯示它是建立我 Node.js Web API 的 Azure 函式的對應版本來建置所有的程式碼和我 Node.js 解決方案依賴的相依性比簡單多了。將此項目,不過,仍使用 JavaScript 做為語言我函式。Visual Studio 程式碼是內建 JavaScript 和 Node.js 的支援。

建立 Azure 的函式專案

安裝後三個的擴充功能和其相依性,是重新建立我的應用程式開發介面的時間。我啟動建立新的資料夾,名為 NinjaFunctions,然後在 Visual Studio 程式碼中開啟我的電腦上。如果您一直跟著,開始使用 Azure 函式延伸到 Azure 函式] 資料夾開啟的資料夾。您可以按一下 [建立新專案圖示 (看起來像是資料夾),在 [Azure 函數] 窗格工具列上。然後遵循提示來選取已開啟的 NinjaFunctions 資料夾和語言。選擇 JavaScript。延伸模組接著加入至資料夾中,函式所需的一些檔案,並初始化的 Git 儲存機制。圖 1顯示 Azure 函式 [輸出] 視窗中,以及檔案 (.vscode、.gitignore、 host.json 和 local.settings.json) IDE 與此程序的結果,將它加入。您也可以查看 [Azure 函數] 窗格列出所有我以雲端為基礎的 Azure 函式應用程式,並在下方,我 Cosmos DB 資料庫多虧該延伸模組。

圖 1 之後建立新的 Azure 函式專案的 Visual Studio 程式碼

在專案中建立 Azure 的函式

專案設定,它就可以建立第一個函式。此函式會將 JSON 檔案匯我 Cosmos DB 的資料庫。請注意,我已經建立新的資料庫帳戶 (lermandatapoints) 我尚未建立資料庫或集合。我將會執行,使用 Azure Cosmos DB 延伸模組。擴充功能窗格中,以滑鼠右鍵按一下您要建立資料庫,並從功能表中選擇 [建立資料庫的 Cosmos DB 帳戶。當系統提示您的新名稱的型別 (採擷,當然是忍),此資料庫將會建立在您使用預設設定的 Azure 帳戶。放心地調整這些設定入口網站中的,如有必要。最後,建立集合資料庫中,以滑鼠右鍵按一下新的資料庫中,選擇建立的集合提供它的名稱。我是無趣,呼叫我集合忍,以及。您可以保留空白這個小示範資料分割索引鍵。

第一個函式的目標是讀取 JSON 格式中提供現有文件,並將其新增至新的集合。  如果您已閱讀我最近的 Azure 函式文件,這個資料行中,您可能還記得一個稱為 「 建立 Azure 函式,可以讀取從 Cosmos DB 與幾乎沒有程式碼 」 (msdn.com/magazine/mt829268)。在此情況下,我要建立可以寫入 Cosmos DB 幾乎沒有程式碼的函式。

我將不會建立在前端。相反地,使用郵差應用程式來建構我 Api 的呼叫和傳遞做為訊息主體中的 JSON 文件。您可以使用 Fiddler,相同以及。

重新開啟 [Azure 函數擴充功能] 窗格中,按一下 [專案資料夾中建立新的函式的 Create Function 圖示。我想此函式以回應 HTTP 要求,因此選取 HTTP 觸發程序,然後提供名稱。我是 AddNinjaDocument。下列提示,請函式匿名以便更輕鬆地測試而不需要提供認證。

為了回應此動作,則延伸會建立三個檔案的新資料夾:

• function.json,其中包含此函式的預設組態

• index.js 檔案的邏輯

• 範例資料檔

設定函式

要建立我年 1 月 2018年資料行中,「 建立 Azure 函式來進行互動以 Cosmos DB 」 的函式 (msdn.com/magazine/mt814991),此函式會輸出到 Cosmos DB 資料庫的資料。在之前的文章,入口網站用來設定這項整合,在入口網站到 function.json 檔案寫入的選擇。此時,我會定義組態手動 function.json 中。開啟檔案,您會看到兩個整合已經定義過了,基礎的 HTTP 觸發程序範本來。之後的第二個整合,請加入逗號,然後複製在此 cosmosDB 組態中,指定要傳送至資料庫、 整合 (cosmosDB) 的類型、 資料庫和集合名稱、 連接設定,以及方向的文件的名稱(出至資料庫) 的整合:

{
  "name": "outputDocument",
  "type": "cosmosDB",
  "databaseName": "Ninjas",
  "collectionName": "Ninjas",
  "createIfNotExists": true,
  "connectionStringSetting": "mydbconnection",    
  "direction": "out"
}

我可以 local.settings.json 檔案中定義連接字串,因此不必硬到 function.json 檔案。Local.settings.json 是本機檔案表示的 app.settings.json 將駐留在入口網站,且包含應用程式密碼。

因此,在這裡,只表示可以在呼叫 mydbconnection 設定中找到的連接字串。

此設定則是放在 local.settings.json 值 」 一節。您可以複製連接字串 Cosmos DB 中的帳戶 Cosmos DB 延伸模組] 窗格上按一下滑鼠右鍵,然後再將它貼 json 檔案。字串的開頭:

"mydbconnection":
"AccountEndpoint=https://yourdb.documents.azure.com/

Azure 函式的核心工具的未來增強功能,在 cosmosDB 類型 function.json 檔案中的目前狀態將會觸發自動安裝封裝執行和偵錯您的專案在本機上所需的邏輯與擴充功能。不過,在這個階段中,您會需要手動安裝此套件。讓我們來看。

在終端機視窗中,請確定您指向根資料夾中,NinjaFunctions,並輸入下列命令,Azure 函式 CLI:

func 擴充程式安裝-p Microsoft.Azure.WebJobs.Extensions.CosmosDb-v 3.0.0-beta7

請注意,我正在安裝我撰寫這篇文章是最新的 beta 版本。如果您需要手動安裝它,您可以檢查最新版本的 NuGet 頁面 (bit.ly/2EyLNCw)。這會建立新的資料夾,在您的專案中呼叫函式延伸模組 (請參閱圖 2)。資料夾包含一個.NET 標準 2.0 專案,專案檔驅動 extensions.csproj。Csproj 程式碼清單是在圖 3

圖 2 的新功能延伸模組資料夾來存放 Cosmos DB 延伸模組

圖 3 Cosmos DB 延伸模組的參考 extensions.csproj 資料夾

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
      <WarningsAsErrors></WarningsAsErrors>
      <DefaultItemExcludes>**</DefaultItemExcludes>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.CosmosDb"                       Version="3.0.0-beta7" />
    <PackageReference       Include="Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator"       Version="1.0.0-beta2" />
  </ItemGroup>
</Project>

加入程式碼片段

讓我們回到 AddNinjaDocuments 函式。Function.json 檔案是所有集合,因此下一個步驟都是完成 index.js 檔案,也就都是函式的邏輯的所在。您可以刪除所有預設的範例程式碼。您只需函式是程式碼來將傳入的 JSON 繫結至函式的輸出中。換句話說,傳給 Cosmos DB 集合:

module.exports = function (context, req) {
  context.bindings.outputDocument=req.body;
  context.done();
};

但有一些偵錯的資訊幫助。因此,而不是單純的精簡版本中,預設值的範例程式碼的整個內容以下列內容取代:

module.exports = function (context, req) {   
  context.log('HTTP request received.');
  try {
    context.bindings.outputDocument = req.body;
  }
  catch (error) {
    context.log(error);
  }
  context.bindings.res = { status: 201, body: "Insert succeeded." };
  context.done();
};

JavaScript 程式碼是與 C# 函式的程式碼在上一個文件中相當不同。您可以了解 Azure 功能中的 JavaScript 結構bit.ly/2GQ9eJt

傳遞至函式的內容供執行階段中,將資料移轉入和函式。我名為 Cosmos DB 繫結 」 outputDocument"function.json 組態中。現在我將該繫結設定為任何主體會封裝在傳入的 HTTP 要求。建立繫結的範本名為 res HTTP 回應,其中用於轉送函式的成功。Context.done 方法會通知執行階段函式已完成。

Visual Studio 程式碼中執行函式

因此,這就是沒有函式 !所有其他項目是由應用程式設定、 函式的組態和 Azure 函式應用程式開發介面處理。您可以繼續,並在 Visual Studio 程式碼中執行函式。雖然絕對可以偵錯、 設定中斷點,並瀏覽變數,讓我們剛執行的函式應用程式,您可以使用命令的終端機中:

func start

這將會在終端機視窗中顯示打光彩色的 Azure 函式標誌,並接著輸出部分處理資訊。在所有輸出結束時,您會看到 URL 執行此函式。如果您的專案中有多個函式,Url 將會針對每個個別列出。在郵差或 Fiddler,建置一個使用此 URL 的 POST 要求。在本文中 > 一節,您可以將它貼在 JSON 中列在圖 4然後傳送要求。圖 5顯示我郵差 UI,使用要求 URL 和顯示,並在回應本文。

圖 4 JSON 文件中插入至資料庫程式碼

{
    "Name": "Kacy Catanzaro",
    "ServedInOniwaban": false,
    "Clan": "American Ninja Warriors",
    "Equipment": [
      {
        "EquipmentName": "Muscles",
        "EquipmentType": "Tool"
      },
      {
        "EquipmentName": "Spunk",
        "EquipmentType": "Tool"
      }
    ],
    "DateOfBirth": "1/14/1990"
  }

圖 5 建立要求呼叫 AddNinjaDocuments 函式

確認 [插入]

雖然在 HTTP 回應圖 5一切順利,好實際上已傳送至雲端中資料庫的資料會顯示。這點受惠 Azure Cosmos DB 擴充功能,您可以確認直接在 Visual Studio 程式碼中。首先,我們務必函式應用程式停止執行。在終端機視窗中,請按 CTRL + C 來關閉主機。您可以按 CTRL + C 以取得提示字元的第二次備份中的終端機。

現在,如果在 Cosmos DB 延伸模組中,展開 [帳戶、 資料庫和集合。您可能需要重新整理與重新整理圖示檢視擴充功能的窗格上。在集合中,您可以看到剛才加入的文件。選取,您會看到不只是資料編輯器中開啟您在新增,但由 Azure Cosmos DB 中,加入中繼資料中所示圖 6

圖 6 新文件,如下面的 Cosmos DB 延伸模組

後續步驟

本文章的下載也包含兩個我建立來取代原始的 Node.js 應用程式開發介面的其他方法的多個函式。其中一個會傳回依名稱部分和其他傳回識別碼為基礎的資料進行篩選的資料。這些項目,而不需要以 Cosmos DB 輸出繫結,會定義使用 SQL API 的資料庫查詢的輸入繫結。HTTP 回應串出查詢結果的 JSON 表示法。

一旦您已經測試並偵錯您的 Azure 函式,在 Visual Studio 程式碼中,您也可以使用延伸模組發佈至您的 Azure 帳戶的函式。您可以學習深入了解擴充功能的讀我檔案。

建議您看一下 github.com/julielerman/AureliaDocDB GitHub 儲存機制中也有我原始文件下載。API 位於 [模型] 資料夾,而且您會發現,沒有更多的程式碼進行讀取和寫入比 DocumentDB 中的呼叫,為 Azure 函式,這點受惠 Cosmos DB 與整合的相關。我認為我撰寫程式碼在未來,我將一律視為 Azure 函式防禦中的第一行時寫入另一個 Web API !


Julie Lerman Microsoft 地區主管、 Microsoft MVP、 軟體小組指導,以及位於 Vermont 山區顧問。您可以找到其呈現在資料存取和使用者群組和所做的心得世界各地的其他主題。在她部落格thedatafarm.com/blog和以及 Code First DbContext 版本中的,所有從 O'Reilly Media 是"程式設計 Entity Framework"的作者。在 Twitter 上關注她: @julielerman ,請參閱在她 Pluralsight 課程juliel.me/PS 影片