# 數據點 - Aurelia 與 DocumentDB 結合: 結合之旅
通過?[Julie Lerman](https://msdn.microsoft.com/zh-cn/magazine/mt149362?author=Julie+Lerman)?| 2015 年 11 月

在過去的幾個月您所見,通過本專欄中,我探測到未知的領域。我年 9 月的專欄中深入探討了名為 Aurelia,與后端 ASP.NET 5 Web API 來檢索和存儲數據通信 upstart JavaScript 客戶端框架中的數據綁定。該 Web API 在后臺都使用 SQL Server 和實體框架。我年 6 月的專欄中探討了新 Microsoft Azure NoSQL 數據庫服務,DocumentDB。該列中我還構建了 ASP.NET MVC 5 Web API,但該 Web API 利用 DocumentDB.NET 客戶端庫與 DocumentDB 數據庫通信。
與各個輪子 greased Aurelia 和 DocumentDB,我希望將這兩個組合到一起。我講述的內容向下一些凹凸道路和命中一些墻,但最終最終上正確的路徑以允許 Aurelia DocumentDB 與進行通信。在本專欄中,我將分享一些我在此過程中中學到的經驗,并簡要介紹我最終的解決方案。在即將發布的專欄中,我將提供有關該解決方案的詳細信息。
當您將肯定學習大量從我最終總結出了解決方案時,我認為在此過程中時采取的步驟,甚至包括那些導致失敗,同樣教育。
我將通過共享我的計劃開始 — 在使用 JavaScript 和其許多 Api、 工具和模式的缺乏經驗的真空產生 — 然后顯示內容時看上去很好的方法以實現我的目標。如果我改為返回直接遷移到正確的路徑,很有第二個想將僅在同一到達困境我找到更好的方法,我選擇和重試已過。然后,當然,我將與您共享真實的路徑,盡管它需要進行更多本專欄來告訴整篇文章單個一部分。
## 優秀的規劃: "如何難?"
Azure DocumentDB 是一種服務,并與它的原始交互是通過 SQL 語法或 RESTful HTTP 調用。在以前的專欄中,而不是以該低級別工作我利用了 Microsoft 已為 DocumentDB 創建的許多 Api 之一 —.NET API。這使我可以使用 LINQ 來表示和執行針對我的數據庫的查詢如:
~~~
return Client.CreateDocumentQuery(Collection.DocumentsLink)
????? ?.Where(d => d.Id == id)
????? ?.AsEnumerable()
????? ?.FirstOrDefault();
~~~
我編寫了一個 Web API 來為我完成這項工作。
在我的專欄 Aurelia 數據綁定演示中,我就能夠方便地進行 HTTP 調用到不同的 Web API,一個使用實體框架進行命中 SQL Server 數據庫。我可能已經只需替換為該 Web API 是我在此之前構建可以與 DocumentDB 交流。將在該方案中,完成我的工作和此專欄應該會由我曾經閱讀過的最短的一個。如何令人乏味。
相反,我認為它在某些情況下將會更加有趣使用 DocumentDB 提供直接的其余部分交互。它看起來非常簡單。DocumentDB 文檔顯示 HTTP 請求對 DocumentDB,我認為我能夠可以利用所做的很多的示例。圖 1?說明一個示例。
圖 1 到 DocumentDB 示例 HTTP 請求
~~~
POST https://contosomarketing.documents.azure.com/dbs/XP0mAA==/colls/XP0mAJ3H-AA=/docs HTTP/1.1
x-ms-DocumentDB-isquery: True
x-ms-date: Mon, 18 Apr 2015 13:05:49 GMT
authorization: type%3dmaster%26ver%3d1.0%26sig[A HASH GOES HERE]
x-ms-version: 2015-04-08
Accept: application/json
Content-Type: application/query+json
Host: contosomarketing.documents.azure.com
Content-Length: 50
{
?query: "SELECT * FROM root WHERE (root.Author.id = 'Don')",
?parameters: []
}
~~~
但并不那么容易。若要開始,您將看到授權中,主密鑰不是您想要在客戶端應用程序內提供的內容。此外,它不是真正來源于在 Azure 門戶中 ; DocumentDB 設置的主密鑰它是對鍵加的其他信息的哈希值。"訪問控制上 DocumentDB 資源"文章網址?[bit.ly/1O9dBfP](http://bit.ly/1O9dBfP)?介紹如何構造此字符串中,但即使這并不讓我能夠在 Fiddler 中測試這些 API 調用。
但更大的問題是我不會執行此操作在客戶端應用程序中,是否仍要。根據"確保安全訪問到 DocumentDB 數據"的建議體系結構 ([bit.ly/1N2ZiuF](http://bit.ly/1N2ZiuF)) 是創建具有對您的主密鑰的安全訪問并能夠生成并返回要使用的客戶端應用程序的資源鍵的中間件。
因此,我寫的。我構建 ASP.NET Web API 使用 DocumentDB.NET 客戶端按需返回的正確組合的資源鍵。這需要執行的所有是我以前的 DocumentDB 專欄,我在其中定義我的 Azure 帳戶、 數據庫客戶端、 該數據庫在該客戶端以及在該數據庫內的集合的一部分的安裝程序相同的代碼。此外,我必須連接到數據庫 ; 一個 85 行控制器選中了某用戶 ;檢查為清除并重新創建該用戶針對我原準備執行 ; 該操作的權限然后生成、 哈希運算并返回給請求客戶端的資源令牌。這就是代碼的要理解和設置非常復雜的一些。
與該服務后下, 一步是讓我 Aurelia 的應用程序調用該服務可以檢索給定的操作的令牌然后重用該令牌中該操作。這沒有太大區別從長遠來看比我們使用,例如,為 Windows Communication Foundation (WCF) 服務的安全操作。但它所做的非常瑣碎的解決方案。并在結束時,我仍不能因為沒有更多的復雜性所需的 DocumentDB 構造合適的請求與在客戶端 (JavaScript) 我生成的資源令牌。DocumentDB 拒絕授權我的請求來檢索數據。所以我決定在我自己 RESTful 調用直接從客戶端應用程序通過 HTTP 我 DocumentDB 是不要通向成功的路徑。我操作,但是,預計的 DocumentDB 發展,因此將用于連接到它,我們選項以及我打算在將來再次訪問這一想法。
盡管如此,所有未丟失。DocumentDB 還有 JavaScript SDK。此 SDK 會知道如何構建 RESTful 調用 DocumentDB 到我的名義即使我已使用其較高級別的方法。我進入我理解了我可以讓它構造為我使用從我 ResourceTokenGenerator 的 Web API 請求的資源令牌請求的客戶端解決方案的 SDK。最后,這感覺像的正確路徑,但最后我按另一種墻上: 無法啟用跨域資源共享 (CORS),這意味著不會允許我在一個域上的客戶端應用程序從我的服務在另一臺到調用。
此時,我的資源和我的好奇心有關將具有已用完 RESTful 調用沒有為此對我來說,一個包裝的情況下,并仍不想要只需轉到我現有的 Web API 來獲取我 Aurelia 的應用程序可以與 DocumentDB 交流,我講述的內容關閉另一個的道路。
## 成功: DocumentDB、 Express、 Aurelia 和 Node.js
除了。NET 和 JavaScript 客戶端 Sdk,DocumentDB 還提供了 Node.js SDK ([bit.ly/1LifOa1](http://bit.ly/1LifOa1))。這使您可以使用 Node.js,可在服務器端運行的 JavaScript 實現 — 非常像 ASP.NET 代碼隱藏邏輯 — 可以輕松地訪問 DocumentDB。所有配置、 身份驗證和構建 RESTful API 調用的硬部分包裝到方法的 sdk。因此我決定這是我必須為讓應用程序與 DocumentDB 我 Aurelia 要遵循的路徑。它對我來說意味著大量的新學習障礙。我有永遠不會接觸 Node.js,是著名的 JavaScript 門外漢;此外,它涉及的其他 API Express,它的核心功能,以使其更輕松地使用 Node.js 的一組包裝。但 IntelliTrace 的功能并非僅限于此。對于我第一 Aurelia 深入,我必須要想習慣使用命令行中的使用以及使用 SublimeText,是為 Web 開發更 savvier 比記事本的文本編輯器。由于大部分該早期應用程序中的操作是在客戶端,我就能夠調試的瀏覽器。但現在我已在其中調試位于服務器上的 Node.js 代碼。打開 Visual Studio 系列產品,Visual Studio 代碼,為添加的新內容是很棒的工具程序。
幸運的是,我就能夠受益于兩個密鑰的示例。DocumentDB 一端是用于構建與 Node.js 和 DocumentDB 一個小型 Web 應用程序的演練 ([bit.ly/1FljQs6](http://bit.ly/1FljQs6))。在 Aurelia 一側,沒有一個存儲庫設置的主干 Aurelia 應用程序使用已集成的 Node.js 服務器端邏輯的 GitHub 上 ([bit.ly/1XkMuEX](http://bit.ly/1XkMuEX))。
為了實現我的解決方案,非常重要有充分的了解使用 Node.js SDK 示例的基礎結構。我將花費超出高級預排中提供了哪些功能的詳細信息公開此專欄的其余部分。這將為如何我關聯了 API 在我最終解決方案中的顯示設置您權限。
DocumentDB Node.js 預排中提供了利用 DocumentDB Node.js SDK 進行通信與 DocumentDB 的 Node.js 中的后端邏輯。此邏輯的第一段是負責創建實例的數據庫連接,如有必要,首先創建數據庫并創建要使用的數據庫中的特定集合的實例的一對的泛型的實用程序。這些實用程序可以重用在其他應用程序進行通信與任何 DocumentDB 因為 DocumentDB 允許您傳入的身份驗證信息和其他信息以指定的數據庫和正在使用的集合。
此實用程序類開始通過使對用于已安裝到解決方案的 Node.js DocumentDB SDK 的引用:
~~~
var DocumentDBClient = require('DocumentDB').DocumentClient;
~~~
它然后設置作為參數的相關的連接信息所采用的方法。在這里,例如,是 getOrCreateDatabase 方法,該首先定義一個查詢來獲取該數據庫從 Azure,然后使用 SDK DocumentClient 類的 queryDatabases 方法來執行該查詢方法的類聲明的開頭。如果結果都為空,(未顯示) 的另一次調用將為您創建數據庫。從方法返回的數據庫實例。您可以看到所引用的文章中的 DocDBUtils 類的完整清單 ([bit.ly/1FljQs6](http://bit.ly/1FljQs6)):
~~~
var DocDBUtils = {
?getOrCreateDatabase: function (client, databaseId, callback) {
? var querySpec = {
?? query: 'SELECT * FROM root r WHERE r.id=@id',
?? parameters: [{
??? name: '@id',
??? value: databaseId
?? }]
? };
? client.queryDatabases(querySpec).toArray(function (err, results) {
? // Additional logic to specify callbacks and more
~~~
邏輯,在一個名為 tasklist.js,文件中的第二個塊區是類似于一個控制器。它提供了利用 DocDBUtils 類使您可以與數據進行交互所提供的數據庫和集合實例的方法。此控制器專為存儲和檢索 ToDo 項的示例設計 — 任務。任務對象封裝在一個名為 TaskDao,類,您將看到對控制器類中的 TaskDao 實例的引用。控制器具有用于的方法來檢索任務,以及若要添加新的和更新和刪除。此類開頭是對 DocumentDB SDK,以及我剛剛介紹的實用程序類的引用:
~~~
var DocumentDBClient = require('DocumentDB').DocumentClient;
var docdbUtils = require('./docdbUtils');
~~~
Tasklist.js 包括 showTasks 和 addTask 之類的函數。這些函數通過請求對象,并允許以將請求從瀏覽器一起傳遞到另一個進程或注入隨意的響應,將獲取傳遞回瀏覽器的 Node.js 的響應對象作為參數執行遵循 Node.js 約定。圖 2?會顯示 showTasks 函數。
圖 2 showTasks 命令 tasklist.js 控制器類中
~~~
showTasks: function (request, response) {
?var self = this;
?var querySpec = {
? query: 'SELECT * FROM root r WHERE r.completed=@completed',
? parameters: [{
?? name: '@completed',
?? value: false
? }]
?};
?self.taskDao.find(querySpec, function (err, items) {
? if (err) {
?? throw (err);
? }
? response.render('index', {
?? title: 'My ToDo List ',
?? tasks: items
? });
?});
},
~~~
請記住沒有一個其他庫 — Express — 在此示例中使用。速成版將 Node.js 功能包裝到更高級別的方法。請注意 showTasks 函數使用快速呈現要呈現索引視圖 (如 index.html),并傳遞從 DocumentDB 到可用于在 Index.html 文件中使用的任務屬性中檢索到的項的響應對象的方法。
它可響應對 Web 站點的路由,控制器 (TaskList 類) 將是服務器端 Node.js 邏輯的第一個入口點。中的控制器方法的邏輯使用 taskDAO 對象觸發查詢和更新通過調用 self.taskDao.find showTasks 函數中所示。taskDAO 具有 DocDbUtils 用于設置數據庫和集合要使用 init 函數。與現有參與,它可以 DocumentDB SDK 直接使用定義和執行查詢和更新在其查找、 getitem 和 updateItem 函數中,作為圖 3?顯示。

圖 3 工作流依賴關系的 DocumentDb Node.js 示例應用程序類和 SDK
與在 Node.js 中設置的后端邏輯下, 一步是構建的前端。預排中的 DocumentDB 站點上使用一個稱為 Jade 的視圖生成框架。與為視圖和使用 Jade API 的路由設置的 HTML 文件,用戶界面是能夠通過在服務器上,存儲在哪里可以安全地我 DocumentDB 的密鑰進行授權我與數據交互的 taskList 控制器調用來響應用戶導航請求。
## 后續步驟: 掛接到 Node.js 后端 Aurelia
但請記住,我的目標是要 Aurelia 用作客戶端框架中,不 Jade。什么下一步有意有關使用 DocumentDB Node.js SDK 并將它們應用到已啟用 Node.js 的主干應用程序 Aurelia 節點示例在 GitHub 上提供的課程。Aurelia 路由但是,工作以不同方式從 Jade 路由位并且它不是只需"單擊"這兩個填數游戲部分在一起。與 Node.js 和速成版,我"知道的足夠-到-將-危險"的常規 javascript 編程技巧以及我缺乏經驗進行面臨的挑戰不需要它要大得多。但是我未最終處理它萬能的數目 Aurelia 核心團隊成員的幫助。
在我的下一篇專欄中我將向您介紹關鍵的連接器的控制器和 Aurelia 路由之間并顯示如何使用服務器端 Node.js 解決方案與我 DocumentDB 交互相比的直接從 Aurelia 到 Web API 的 HTTP 調用的簡單性。
* * *
Julie Lerman?*是 Microsoft MVP、.NET 導師和顧問,住在佛蒙特州的山區。您可以在全球的用戶組和會議中看到她對數據訪問和其他 .NET 主題的演示。她是《Programming Entity Framework》(2010) 以及“代碼優先”版 (2011) 和 DbContext 版 (2012)(均出自 O’Reilly Media)的作者,博客網址為[thedatafarm.com/blog](http://thedatafarm.com/blog)。請關注她的 Twitter:?[@julielerman](https://twitter.com/@julielerman)?并查看其 Pluralsight 課程,網址[juliel.me /ps-videos](http://juliel.me/PS-Videos)。*
- 介紹
- Essential .NET - C# 異常處理
- 崛起 - 具備批判精神
- Windows 10 - 通過搜索索引器加快文件操作速度
- 最前沿的技術 - 利用用戶體驗驅動設計改善體系結構
- 異步編程 - 從頭開始執行異步操作
- 數據點 - Aurelia 與 DocumentDB 結合: 結合之旅
- ASP.NET - 將 ASP.NET 用作高性能文件下載器
- 測試運行 - 使用 C# 執行 t-檢驗
- Microsoft Azure - 通過 SonarQube 和 TFS 管理技術債務
- 孜孜不倦的程序員 - 如何成為 MEAN: Express 路由
- 別讓我打開話匣子 - Alan Turing 和 Ashley Madison
- 編輯寄語 - 歡迎使用 Essential .NET