2015 年 11 月

第 30 卷,第 12 期

本文章是由機器翻譯。

資料點 - 當 Aurelia 遇上 DocumentDB: 媒人之旅

Julie Lerman | 2015 年 11 月

Julie Lerman在過去幾個月您所見,透過本專欄中,我瀏覽到未知的世界。我年 9 月的專欄探討呼叫 Aurelia,與後端 ASP.NET 5 Web 應用程式開發介面來擷取及儲存資料通訊 upstart JavaScript 用戶端架構中的資料繫結。該 Web 應用程式開發介面在幕後採用 SQL Server 和 Entity Framework。我年 6 月的專欄中探討了新 Microsoft Azure NoSQL 資料庫服務、 DocumentDB。該資料行中我也建立 ASP.NET MVC 5 Web API,但該 Web API 運用 DocumentDB.NET 用戶端程式庫與 DocumentDB 資料庫進行通訊。

使用滾輪 greased Aurelia 和 DocumentDB 我想要結合這兩種。我向下一些 bumpy 道路和叫用一些牆、 但允許 Aurelia DocumentDB 與通訊的正確路徑上最後折衷。在本專欄中我將會分享一些我一路學習到的經驗以及我最終的解決方案的概觀。在未來的專欄,我會提供該解決方案的更詳細。

當您將肯定學到很多我最後想出解決方案時,我認為我花了此過程中的步驟,甚至導致失敗,同樣教育。

首先我要共用我的計劃 — 產生在與世隔絕的缺乏經驗與 JavaScript 和其許多應用程式開發介面、 工具和模式 — 然後顯示 [什麼似乎是同時達到我的目標的好方法。如果改為我直接到正確的路徑,則有可能是您第二個知道我選擇然後嘗試尋找更好的方法僅到達相同造成的瓶頸我已經存取過。然後,當然我將與您分享 true) 的路徑 (雖然它會採用多個單一的一篇故事整個本專欄。

最佳配置計劃: "難可以是很? 」

Azure DocumentDB 是一種服務,和原始互動是透過 SQL 語法或 RESTful HTTP 呼叫。在上一個專欄中,而是在該低的層級工作比我利用其中一個 Microsoft 所開發的 DocumentDB 許多 Api —.NET API。這讓我得以使用 LINQ to express 針對及執行查詢資料庫,例如:

return Client.CreateDocumentQuery(Collection.DocumentsLink)
       .Where(d => d.Id == id)
       .AsEnumerable()
       .FirstOrDefault();

我寫了 Web API 來為我進行這項工作。

在示範我的 Aurelia 資料繫結的資料行中,我就可以輕鬆地進行 HTTP 呼叫不同的 Web API、 用來叫用 SQL Server 資料庫的 Entity Framework 的其中一個。我無法只替換了該 Web 應用程式開發介面與我對談 DocumentDB 建置的一個。在這個案例中,會完成我的工作和這個資料行就是我看過最短的一個。如何無聊。

相反地,我認為使用 DocumentDB 提供直接 REST 互動更有趣。它似乎是夠簡單。DocumentDB 文件顯示 HTTP 要求對 DocumentDB,我以為我就可以運用極多的範例。[圖 1 顯示一個範例。

圖 1] 範例 HTTP 要求來 DocumentDB

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 說明如何建構此字串,但即使這並不讓我在 Fiddler 中測試這些 API 呼叫。

但最大的問題是我就不會這麼做的用戶端應用程式還是。根據 「 保護存取到 DocumentDB 資料 」 的建議的架構 (bit.ly/1N2ZiuF) 是建立中介軟體的主要金鑰的安全存取且能夠產生並傳回用戶端應用程式使用的資源索引鍵。

因此我這麼做。我建置了 ASP.NET Web API 使用 DocumentDB 適用於.NET 用戶端視傳回的正確組成的資源索引鍵。這會詳述所有的安裝程式碼是我之前的 DocumentDB 專欄,我定義我的 Azure 帳戶、 資料庫用戶端、 在該用戶端資料庫以及在資料庫中的集合的一部分。除此之外,我必須連接到資料庫; 85 列控制器檢查使用者資訊。檢查的清除並重新建立該使用者為我所要執行; 動作的權限然後產生、 雜湊並傳回要求的用戶端為資源語彙基元。這是很複雜的一點了解與設定的程式碼。

與該服務的位置中,我的下一步是已呼叫該服務擷取給定作業的語彙基元,然後重複使用該作業在該語彙基元我 Aurelia 應用程式。這不是差不多長期比我們使用,例如 Windows Communication Foundation (WCF) 服務的安全性作業。不過它成為非常多對話的解決方案。並在結束時,我仍然無法建構適當的要求與我的產生的資源語彙基元 (JavaScript) 用戶端因為有多個 DocumentDB 所需的複雜性。DocumentDB 拒絕授權我要求來擷取資料。所以我決定我自己 RESTful 呼叫直接透過 HTTP 用戶端應用程式從我 DocumentDB 已不會產生成功的路徑。我執行動作,不過,預期的 DocumentDB 發展,因此會連結到它,我們選項以及我打算在未來再次造訪這個概念。

儘管如此,所有未遺失。DocumentDB 也有 JavaScript SDK。這個 SDK 就知道如何建構 RESTful 呼叫 DocumentDB 代表我即使當時我使用其較高層級的方法。我將 SDK 帶入我了解我可以讓它建構為我使用我 ResourceTokenGenerator Web API 從要求的資源語彙基元要求的用戶端解決方案。這認為正確的路徑類似最後,但是最後我叫用另一個背景牆: 若要啟用跨原始資源共用 (CORS) 沒有辦法這表示不會允許我在上一個網域的用戶端應用程式上另一個我服務的呼叫。

此時需要耗盡資源和我的好奇心有關進行 RESTful 呼叫的包裝函式如何對我來說不亞仍然不想要只翻轉我現有 Web 應用程式開發介面來取得對談 DocumentDB 我 Aurelia 應用程式,我向另一個道路。

成功: DocumentDB、 Express、 Aurelia 和 Node.js

除了。DocumentDB NET 和 JavaScript 用戶端 Sdk,也提供 Node.js SDK (bit.ly/1LifOa1)。這可讓您使用 Node.js,在伺服器端的運作方式的 JavaScript 實作 — 就像是 ASP.NET 程式碼後置邏輯 — 來輕鬆地存取 DocumentDB。所有的組態、 驗證和建置的 RESTful API 呼叫困難的部分會包裝到方法的 sdk。因此我決定這是我必須讓應用程式與 DocumentDB 我 Aurelia 遵循的路徑。它適用於我的很多新的學習障礙。我必須永遠不會接觸到 Node.js 和我就完全 JavaScript 菜鳥;此外,它牽涉到有其他的 API Express,以方便使用 Node.js 的核心功能的一大堆包裝。但這不是所有。我第一個深入探討 Aurelia,我不得不習慣使用命令列以及使用 SublimeText,是更 savvier Web 程式開發比 [記事本] 的文字編輯器。因為大部分的舊版應用程式中的動作是在用戶端,我能夠直接在瀏覽器中的進行偵錯。但現在我已偵錯 Node.js 程式碼,也就是在伺服器上。開啟 Visual Studio 系列產品,Visual Studio 程式碼的新資源是很棒的工具了。

幸好竟然能夠受益於兩個索引鍵的範例。DocumentDB 一邊沒有建置使用 Node.js 和 DocumentDB 小型 Web 應用程式的逐步解說 (bit.ly/1FljQs6)。Aurelia 一端會有儲存機制上設定的基本架構的 Aurelia 應用程式與已整合的 Node.js 伺服器端邏輯的 GitHub (bit.ly/1XkMuEX)。

若要實作我的解決方案,是非常重要的充分了解使用 Node.js SDK 範例的基礎機制。我將花公開以外的高階逐步解說中所提供詳細資料本專欄的其餘部分。這會為您註冊的方式我 newsreader API 我最終的解決方案中顯示。

DocumentDB Node.js 逐步解說提供 Node.js 運用通訊與 DocumentDB DocumentDB Node.js SDK 中的後端邏輯。此邏輯的第一個區塊是一般的公用程式會負責建立資料庫連接的執行個體、 必要時,第一次建立資料庫和建立要使用的資料庫內的特定集合的執行個體的一組。這些公用程式可以重複用於其他應用程式因為 DocumentDB 可以讓您將驗證資訊和其他資訊來指定資料庫和您正在使用的集合中任何 DocumentDB 相互通訊。

藉由已安裝到解決方案的 Node.js DocumentDB SDK 的參考會啟動此公用程式類別:

var DocumentDBClient = require('DocumentDB').DocumentClient;

它接著會設定做為參數之相關連接資訊所採取的方法。在這裡,比方說,是 getOrCreateDatabase 方法,先定義查詢來取得資料庫從 Azure,然後執行該查詢會使用 SDK DocumentClient 類別 queryDatabases 方法開頭的類別宣告。如果結果是空的 (未顯示) 的另一個呼叫會為您建立資料庫。從方法傳回的資料庫執行個體。您可以看到 DocDBUtils 類別參考文件中的完整清單 (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 — 在本例中使用。Express 包裝 Node.js 功能分成較高層級的方法。請注意 showTasks 函式會使用 Express 呈現來呈現索引檢視 (例如 index.html) 傳遞從 DocumentDB 擷取到可使用 Index.html 檔案中的工作屬性的項目回應物件的方法。

控制站 (TaskList 類別) 為回應 Web 站台的路由伺服器端 Node.js 邏輯的第一個進入點。控制器方法中的邏輯會使用 taskDAO 物件來觸發查詢和更新 self.taskDao.find showTasks 函式中的呼叫所示。taskDAO 有使用 DocDbUtils 來設定資料庫和集合來使用 init 函式。與手中,它可以 DocumentDB SDK 直接使用來定義及執行查詢和更新其尋找、 getitem 和 Index.js 函式中的做為 [圖 3 顯示。

工作流程的 DocumentDb Node.js 範例應用程式類別和 SDK 的相依性
[圖 3 的工作流程具有相依性 DocumentDb Node.js 的範例應用程式類別和 SDK

在 Node.js 中設定的後端邏輯下, 一步是要建置的前端。逐步解說中的 DocumentDB 網站上使用稱為 Jade 檢視產生架構。檢視和使用 Jade API 的路由設定的 HTML 檔案、 使用的 UI 完全能夠藉由呼叫 taskList 控制器的伺服器上,我可以安全地存放我 DocumentDB 的金鑰來授權我與資料互動的使用者瀏覽要求回應。

後續步驟: Node.js 後端的 Aurelia 連結

請記住我的目標是要當做用戶端架構、 使用 Aurelia 不 Jade。什麼下一步所花的使用 DocumentDB Node.js SDK 並將其套用至 Node.js 啟用基本架構應用程式在 GitHub 上 Aurelia 節點範例所提供的相關課程。Aurelia 路由的運作方式稍有不同 Jade 路由,但是並不只需 「 按一下 」 這兩個謎題項在一起。使用 Node.js 和 Express,我一般的 「 知道-夠-到-是-危險 」 JavaScript 技能以及我缺乏經驗進行所面臨的挑戰不是時所需的更大。但是我並未最終會使用它了從數個 Aurelia 核心小組成員的說明。

下一篇專欄中我將帶您逐步完成重要連接器控制器與 Aurelia 路由之間並顯示如何使用伺服器端 Node.js 解決方案互動我 DocumentDB 相較於直接 HTTP 呼叫 Aurelia 從 Web API 的簡易性。


Julie Lerman是 Microsoft MVP、.net 和顧問 Vermont 山區中。您可以找到她針對資料存取和使用者群組和世界各地的研討會其他.NET 主題呈現。她的部落格網址 thedatafarm.com 和的著作 《 Programming Entity Framework 」 (2010) 以及程式碼第一版 (2011) 和 DbContext edition (2012) 全部從 O'Reilly Media。在 Twitter 上追蹤她: @julielerman 並查看她 Pluralsight 課程 juliel.me/PS 影片

衷心感謝以下技術專家對本文的審閱: Ryan CrawCour 和 Patrick Walters
Ryan CrawCour 是 20 年資料庫老將開始多年前的 SQL Server 4.2 撰寫他的第一個預存程序。許多資料指標、 聯結和預存程序稍後他一開始探索令人興奮免費世界的 NoSQL 解決方案。

Patrick Walters 一直一部分絕佳 Aurelia 開發人員社群人員盡情享受提供戴官方 Aurelia gitter 通道上的問題。