>>所以，他這樣說，
排序只是一個簡單的 介紹了原型
和JavaScript對象模型。
我們不會轉向 齒輪一點點談
對有關更多的JavaScript 服務器和圖書館的書架
和連接KNEX圖書館。
所以，你可以實際上只是 -
如果搜索Bookshelf.js 它應該是很容易
發現，應該是先 結果，與書架
大衛剛才提到 給出了很多結構
圍繞JavaScript對象和 與他們的工作關係性
在關係數據庫中。
所以，很多類似的功能 誰是真正嚴重的啟發
通過Laravel的ORM作為 以及Backbone.js，
這是一個前端MVC 庫，讓您
組織你的代碼， 類似於我展示了
與本實施例 原型在那裡你可以 -
而不只是隨意 投擲類
在這裡和那裡你的看法。
它給你的模型和 這些模型的集合
這是為了充當 形式的單點道理
關於對數據 您的應用程序。
然後你聽，因為這些 模型的變化，你說好，
重新渲染此模板 在這裡，這一次在這裡
而不是只在這裡添加類， 添加類那裡，有點挑
上的選擇器，使 蜘蛛網的jQuery代碼。
它提供了更多的基於類的 結構各個部分，
但一個重要的組成部分 該庫是模型
它具有相似的結構 什麼書架模型做。
所以，如果你是熟悉的 書架你很漂亮也
很熟悉 Backbone.js模型，
我會建議 採取一看這個。
因此，一些主要特點
它給你僅僅是 能力到一個對象上設置數據
調用獲取，這 返回一個單獨的記錄
從數據庫，創建 關係相似
為你處理 內Laravel
在那裡你可以說一個 病人創下了一個紀錄方法
並說，這贏得了創紀錄的
其中記錄對象 表名健康記錄。
讓我們來看看。
有很多 - 它屬於 -
只是東西，你 非常相似 -
很熟悉 了，但在JavaScript中。
和引擎蓋下， 對於書架，
它使用一個查詢生成器 所謂Knex.js.
所以，這是KNEX，knexjs.org。
這是一個參考，如果玩具 任何人的曾經玩過這個。
但它可以讓你 - 在 類似的方式，jQuery的，
你只是排序的創建 鏈的不同方法
那你打電話你 數據庫行所以你可以 -
你開始了說 KNEX和表名。
因此，舉例來說，KNEX用戶， 選擇您想要的列，
在那裡，而有不同的地方 條件語句，你可以有
何地，或在那裡， 地方之間，其中不，
現在，下了線。
您可以指定不同的連接 你的數據庫表之間
這書架內部使用 設立某種魔力
周圍的關聯與hasOne，的hasMany， belongsTo的，belongsToMany。
而這樣的組合
兩個讓你做漂亮 多會使用你
在像框架 Laravel的條款
功能 使用數據庫。
所以，讓我們繼續前進，並採取 看一個簡單的例子
對於一個Express應用程序，這 利用這些模型
和集合 書架爵士[拼音]。
所以，我已經設置了一個剛 這裡簡單的應用程序。
我去掉了一些東西 被初始化快遞
並移動到一個init 我創建的目錄。
一對好東西 與快遞工作作為假想的
以Laravel是，有 真的沒有太大的強制執行
你約定俗成的。
所以，你可以創建目錄 -
它並沒有真正給你 一大堆工作過的。
你得的只是一些排序 基本設置，然後 -
但它並不關心 你把他們。
你不必有 控制器的目錄。
你並不需要有一個模型 目錄，config目錄。
排序您可以創建 這些為您的項目需求
並設置了事情的方式 有意義最給您。
所以有代替所有 這個快遞樣板
在主app.js我剛才說的 應用程序需要平等的init /快遞。
所以在init，
初始化文件夾 我只是表達了這裡，
這就需要快速，呼叫 setup函數，調用 -
設置了視圖引擎， JSON解析器，這一切。
所以，現在，讓我們繼續往下。
所以我要求 課程導師會議
和要求的模型。
因此，這些都是一個文件夾中 我決定名字的機型。
它不必是該 但是這樣很有道理，
但是模型只是漂亮 常見的，所以我會推薦它。
但是 - 因此，讓我們去 該課程。
我想我使用 - 是啊，和實例
這兒都是基於 圍繞課程模式。
因此，讓我們只取 一看那個。
所以，現在只是，在 第一行這種模式的，
我已經要求 別的東西。
所以，如果你會注意到在節點 你應該要求
或者你要結束了 需要一大堆
不同的文件 是位於
在不同的地方 在你的應用程序。
和相對路徑 到無論你在哪裡
在當前的應用程序，
除非它是一個頂層已經 定義為你安裝它
用MPM像書架或 KNEX或快或什麼的，
這些都不是相對的。
是嗎？放大更多？
確定。確定。所以，你要 最後，需要一大堆
在你的只是不同的文件 代碼，這是好的和壞的。
在你知道的好方法，其中 事情是，它不是那種
魔術以什麼 引擎蓋下怎麼回事，
這可真的是令人困惑
當你有一個非常 沉重的Java -
或者像非常沉重的框架 Laravel，排序它說，
我們要照顧 這使您不必
要求一切 但你必須
要懂得一切 工程，以使用它。
其中在這種情況下，它的 很簡單，因為到
這裡的一切， 他們只是兩端
了是多了幾分打字。
正如在身邊我很喜歡 使用，有一個插件
如果您使用的是盲目的文字
在這裡你可以安裝節點 模塊幫手，你可以開始
鍵入像導師和 它創造了相對路徑
你在哪裡到 種有用的代碼文件。
因此，課程模式 在這裡需要基地
然後實習基地 需要初始化/書架
然後在書架，它 需要頂層書架
然後用它初始化 初始化KNEX實例，
這台客戶機名稱
和連接 設置為數據庫。
所以我只是用一個簡單的 續集臨其實例 -
MySQL的的，我用它訪問 續集Pro和它剛剛排序
一個類似的數據庫， 設置，因為我們有
在第一個示例應用程序 與課程目錄。
所以，我設置我的連接 設置在這裡，
而這些都記錄在案 該Knex.js項目頁面上
至於如何設置 這些連接。
所以，我現在有我的示範基地。
正如我提到的與 原型的變化，
所以，實際上可以 善待很多的 -
增加了很多的樣板 你的代碼，以便約定
已調整 由Backbone.js
現在Bookshelf.js是 添加此擴展方法
作為一個靜態屬性 您的JavaScript對象，
這使得它有點差不多 基於class的繼承性質
在那裡，如果你調用 延長您可以設置任何
原型方法 你想在這裡
然後你可以 - 任何 額外的靜態方法
你可能想，你 可以只設置它們自己
在這裡，所以我可以擴展它 有 - 所以，如果，例如，
多個模型需要 顯示名稱，這讓名稱。
所以，在這裡，我要說的 對於模型顯示名稱
默認情況下，無論是它的名字 物業否則返回
沒有名字。
而現在每 模型，它是一個 -
擴展這個基本模型，我 現在有一個顯示名稱的方法
在原型 鏈某處。
如果我想將其覆蓋 我可以將它設置 - 設置什麼 -
的getName會在這裡。
它可以讓你模仿 經典傳承
在JavaScript中，它可以是 好特別的東西
那些借給自己被 基於類的喜歡的對象模型。
因此，讓我們跳回到 應用程序代碼。
所以，我有只是一個路由 斜杠，只為我的索引
然後斜線課程。
和這兩個都調用 該renderCourses方法。
如此反复，功能 第一類，並可以傳遞
作為方法的參數。
所以，在這個app.get， 我打電話 -
我傳遞renderCourses 作為參數。
和渲染 - 或函數 可以設置像變種 -
因為我是做早期的變種 renderCourses等於功能
或者它們可以是剛 功能renderCourses。
它不會使太 多大的差別。
實際上，你能有什麼 被稱為函數名稱
表達，這是 無功renderCourses等號
功能renderCourses。
而且，為了想擁有的原因 特別命名的功能
在節點是它 給你一個更清潔 -
更可讀的堆棧跟踪。
所以，如果你有一大堆
匿名函數 它會說 -
當你有一個錯誤 在你的代碼you'll -
你不會知道哪個函數 它呼喚你不得不看
在碼數 和行號
並且它有時更容易 只是為了直觀地解析
當你真正有名字
的職能 自己在服務器端。
所以這renderCourses， 讓我們稱之為節點的應用程序 -
所以我在聽 核心3000 [音譯]。
等這一切都做對了 這裡只是讓所有的
課程從數據庫中。
我什至不限制它 所以它在做一個龐大的數字
排它的返回。
而為了做到這一點，
在球場上的模型有 是一個靜態屬性
所謂的集合。
所以，我只是把它 - 我 說，創建一個新的集合
這個過程中， 然後把它拿來，
然後返回課程 集合在這裡的承諾。
所以在內部，大衛 - 中 最後半教一點點
關於承諾和承諾是 大量的使用在這兩個KNEX
和書架，因為 它借給了 -
它給你的 有一堆的能力
不同的異步調用 和排序的連接在一起，然後
或取東西，然後
與呼叫另一 異步數據庫調用
並返回該值與 然後跳轉到下一個再
而未來再然後有一個 趕在最後排序
的模擬異步嘗試捕捉 與異步代碼的行為，
因為你看到它現在
但它更難一次 你開始處理它。
異步代碼 只是無處不在
在服務器端JavaScript和 真的到更大的程度
比你已經習慣了，如果 你做的JavaScript
在客戶端上。
所以這真的，真的 幫你在那裡。
但只是為了告訴你 調試器聲明
我說的是在 該節點檢查工具，
我要繼續前進， 這裡拋出一個調試器線
在renderCourses功能 和看到的地方，讓我
當我 - 所以節點 檢查員可以安裝
通過做NPM安裝 與G標誌，
這意味著全球 節點督察。
它會讀取它的NMP 和全球安裝
為您的應用程序 所以你可以把它叫做
在命令行中。
我已經安裝了 它，所以我會繼續前進， -
實際上它可能有 等待它會只取，
只需兩秒鐘。
什麼節點檢查 再次允許您
這樣做是有這個無頭 版本調試器控制台
您正在使用的工作時， 在客戶端側，並能
停下來，只是添加指定 在你的代碼點。
停止執行，並採取 看一下這是怎麼回事，
這將真正有 派上用場，如果該功能
這樣的人可用
調試時你 PHP代碼，我敢肯定。
因此，讓我們只取 一看那個。
所以，我只能打電話 節點檢查
它會說訪問這個網址 端口5858開始調試，
這只是默認 對於如何啟動。
所以，我現在已經得到了 - 有 什麼怎麼回事
因為我需要開始。
因此節點僵局[拼音]的 調試標誌，然後app.js.
所以說，調試器 監聽端口5858，
Express服務器監聽 在3000。
所以，我們是好去。
讓我刷新此。
現在我可以看到app.js 我只是在看代碼
但在這裡，在控制台中。
所以，現在，如果我嘗試運行此， 你可以看到它，它會停止。
它只是在等待，因為它 整個執行代碼現在
停在這個調試器 我已經擺在那裡行。
我現在可以服務器 -
[無聲備註]
哦，是的。什麼是關鍵字 快捷鍵可放大屏幕？
哦，有。
得到了它。確定。
[暫停]
哦，這不是找 [拼音]這一點。
因此，課程是真正的大
因為我不是做 限制條款或任何東西，
它只是在獲取 課程整個數據庫
這是很多人。
等等 - 這是目標
實際上可能會崩潰 說明檢查員實例。
It's - 確定。
讓我做了限制，並 那麼我們可以來看看
當它不取 數以百計的課程。
所以，殺死服務器 和督察
我會做的，當然 收集查詢限制20。
所以，書架， 不像在Laravel
在那裡你可以調用 直接限制或調用任何
這些SQL方法 您使用
直接在ORM的實例。
你使用這一點任何時候 這是提供的SQL方法
在KNEX，你必須 調用查詢進行排序
為進軍查詢鏈。
這可以被調用 與任何一個功能時，
因此可以說，功能 此限制10或調用它
通過指定 方法，你想打電話
在KNEX實例 然後它的價值。
所以我們要做的 限制20，然後設置。
我們其實並不 需要在這裡調試
因為我們可以只 設置斷點
這使得它更容易。
好的。
所以，讓我們設置一個斷點 在這裡，並嘗試加載它。
錯了行。
就在這兒。
[暫停]
確定。因此，它再次停止。
所以，現在的課程是 與20的長度反對
我們可以看到所有不同 模型，它是牽強
從數據庫就在這裡 所以我有一個模型對象
其中有，裡面的 屬性屬性
在對象上所有的東西 它是在數據庫中找到。
有任何事件 已註冊
這樣你就可以註冊 不同的事件，
例如，當 模型被刪除
或者當它被取出，
您可以設定不同的 屬性或修改的東西。
有很多不同的鉤子 而這些都記錄在案
在Bookshelf.js 文檔，讓您
做那樣的話 你真的想這樣做
您的機型 和集合。
你可以 - 他們的意思 真正做到定制
並很容易 你去適應他們
您的需求 應用程序。
但是，僅僅通過看這裡，
我能看到什麼不同 課程可供選擇。
在這種情況下，我 居然沒取
具有比其他任何其他數據 只是課程本身。
但是在類似的方式來 雄辯的ORM可以設置
向上關係，所以當然 屬於很多導師。
所以，如果我繼續前進， 停止應用程序，
跳轉到此取通話時，您 可以指定不同的選項
你想要 跟著它傳遞。
其中一人是 加載相關的代碼的能力
通過指定withRelated 然後導師課程。
因此，讓我們回去新鮮 這再一次在這裡停止。
所以，現在，該課程對象， 相同數目的模型，
但現在每個模型 有關係的散列
其中有導師 它的相關的。
因此，這門課程為例
這當然是082有兩個 相關教練機型。
而且你已經可以看到如何 容易得多，這是要排序
在視覺上比工作 當你處理的東西
樣的，你改變代碼 然後再次嘗試在PHP。
事實上，你可以只 停止執行完全
並評估什麼是這裡 在 - 在控制台中， -
縮小，課程，你知道，
那是什麼地方範圍 變量可用
這是目前全球 對象，因為當你看到它，
除非你有一個叫 特定情況下，它不會
有相關的東西在這裡。
然後，在 - 讓我 顯示出幾個例子
落實承諾。
所以不是做這個 這裡withRelated教官我
要繼續前進，並推動這一 獲取，然後課程，
我要回 courses.load導師。
然後 - 然後你打電話呢。
[暫停]
是這樣，那麼在這一點上，本 課程應被載入
與導師，這 是異步操作。
但是，因為我們正在將其返回 從一個承諾，下一個值
因為那時無論是這 異步調用返回
在這種情況下，負載 在書架的方法
這實際上返回 集合本身。
所以它的加載 在有導師
然後你可以指定 - 如果它只是一個屬性，
您可以指定此 作為字符串，否則，
你可以做導師 和要求
作為一種方法 - 對不起， 作為一個數組。
然後，如果你想獲得 真正看中並限制任何
這些給取，你 可以作為一個哈希指定它
與教練，然後什麼 你想限制查詢上。
所以，我想加載所有 教師對課程的地方 -
所以QB的查詢生成器 其中狀態是積極的。
你可以得到真正 花哨的任何
相關查詢 你想建立。
但是，就目前來看，我們要 堅持公正導師
我們正在返回該值
所以那麼接下來則應該 把所有的課程裝
正確。
如果有錯誤 在該鏈中的任何步驟中，
它會跳下來的漁獲物。
所以，讓我們繼續並運行。
所以每次 - 不像在 PHP，一個缺點是
“因為節點”是一個長期運行 過程中，你實際需要
停止的節點的過程 當你更新你的代碼，
因為它的版本 在運行時運行的是，
的版本 這是加載的代碼
開始時不 你有什麼樣
的更新你的代碼 用至今。
確定。我們將設置一個斷點 這裡，這裡和刷新。
[暫停]
呵呵，我居然沒 要么刷新此頁面
所以這是在舊的過程。
所以，你刷新這兩個 和節點檢查。
所以，現在我們看到的課程。
如果我們只取樣品 ，這些車型之一
我們可以看到，該關係 對象是空的，但是現在 -
而你所需要的原因 設置斷點的是，好了，
我提到，你可以 跳進堆棧跟踪
看看你知道，在那裡 它會在應用程序中。
所以，現在我可以看到什麼 發生在負載的方法，
我已經定義 藏品。
它有點兒“渴望負荷 關係到一個已經“。
而且你可以通過一步 看一行行
在那裡這東西 這將是偉大的。
如果您有什麼 這是在您的代碼中碎，
它扔了一些錯誤， 你喜歡，我真的想
看看這是怎麼回事。
但只要你碰到 一些異步的， -
它進入下一個 打勾的事件循環
你會失去你 - 你失去你的地方
在節點檢查。
所以，你需要說， “好了，一旦我失去了這一點，
它現在需要停止 在這一行了。“
因為如果我不停地打 下來，下來棧，
這將有最終只是 走遠了我沒有設置這個
第22行藍色斷線。
所以，現在，如果我看 在課程在這裡，
它應該在的關係 教官
然後讓 教師重視他們。
所以，你可以看到我回來 從第一個應許的承諾
然後你就可以不斷 做到這一點的路線。
因此，不同的承諾， 答應庫，
我用一個叫藍鳥 這是真正有用的。
它增加了很多不錯的這 改變異步 -
改變回電 基本代碼到東西
與承諾效果很好。
但是 - 對不起[聽不清]什麼 我正想說在那裡。
讓我們一起來看看 儘管在 -
所以讓我們說有一個 問題取東西的時候。
所以，我有這個其他路線 找到所謂的課程編號。
因此，讓我們做的，當然2。
我可以得到 - JSON當然。
而這樣做[聽不清]。
[暫停]
我聞到什麼東西錯在這裡。
不上3000，我是在 Chrome的檢查選項卡。
確定。因此，讓我們去 當然 - JSON課程1。
而這只是返回的JSON 格式，當然裝
與一些教練。
但我想這個例子 給這裡的是，
我做的JSON課程編號。
以及在提取的參數， 我指定要求真實，
這是一個選項，這是 記錄在書架
在那裡的說，“如果， 我試圖找到這門課程
而它的不存在， 然後拋出一個錯誤。“
這應該是捕獲 CATCH塊到這裡。
因此，讓我們繼續前進，跳回 到節點檢查，並嘗試
而打破這種和 看看我們得到了什麼。
因此，讓我們設置一個斷點 這裡的JSON的過程。
好的。
我會去的JSON場和 我只想把一些 -
[暫停]
它可以是一個有點棘手 有時，當你試圖
管理哪一個 已更新
而哪些沒有 - 讓我們來看看。
所以它的調用錯誤 空響應。
[暫停]
讓我們拋出一個調試器在這裡。
因為如何節點 其實優化
對於JavaScript的運行時 以這麼快的服務器上，
有時節點調試器 當您嘗試了一些錯誤
並動態設置斷點 而你實際上需要做的
使用調試器和 沒有線，由線。
因此，讓我們看看這個 我們得到了我們想要的。
所以我設置，app.get json的課程編號，
我已經把我的調試器有
在catch語句 在底部。
取需要真實的，它應該 - 沒事，我們走吧，弄壞了。
所以，現在我可以看到 它停止了
在這最後的catch塊 因為withRelated -
或者因為要求真實 指定，並且沒有課程
這種大的ID 通過異常數
這是現在Emessage。
而在JavaScript中的每個錯誤 有一個堆棧屬性
這與它一起。
所以這是非常有用 到例如
安慰e.stack註銷。
我可以清楚地看到 當我打一個錯誤。
所以我得到的錯誤空 響應，這就是消息
這是通過書架傳送。
但現在，我可以看看 在，在調用堆棧，看看
在書架 方言SQL模型83，
此空響應 被拋出錯誤。
而這正是我 所提到的，它的點匿名
因為它是一個匿名 功能。
如果這是一個函數名 你有更好的想法
到真正發揮作用 通過，而不必去
進入model.js代碼。
雖然它的意思是 相當，相當可讀，
這樣我就可以看到，在網上。
他們跟什麼 我是線83。
所以，如果options.require和 響應不存在，
現在拋出一個新的 空響應錯誤。
所以你可以看到漂亮 直白是如何工作的。
並在內部書架，
那裡只是一個整體 一堆使用承諾的。
所以，你可以指定 Promise.method
與藍鳥庫 這使正確的上下文
這同時回國 的承諾。
所以我 - 我綁定 這種類似的價值
什麼我已經提到 較早，但使用的承諾
然後我可以 - 是新的。
它可以是異步的 或不，如果我想要的。
然後我做了一些 其它的可能
是或可以不是異步和 然後各種跳下來此的。
所以Promise.all是一個幫手 很多流行的庫有
在那裡你可以有一個 潛在的可能陣列
是或可以不是承諾。
一旦所有這些都 完成後，您返回
然後它跳躍 行到下一行
你可以看到它是如何真正 變平金字塔
你得到的， 回調地獄作為它的已知
如果你正在做的一切 用回調函數一行行。
有辦法來解決 但那個承諾是一體
在我認為最好的方法
要真正讓你的代碼 乾淨，易於閱讀。
所以這只是一個短暫 介紹了JavaScript的
並書架 和KNEX一般。
而且，如果有任何疑問， 我知道這是一噸材料
要排序的嘗試和蓋 特別是因為語言，
不像大多數，你是 熟悉，所以我只是想
使其使得至少 如果你有問題
與您的代碼，你 那種能跳 -
這是我喜歡做的事，就是 排序跳進庫
我使用看看 事物是如何構成的。
還有一個，我已經提到 早期所謂的Backbone.js
而實際上它 [聽不清]在客戶端
幫助給模型視圖 控制器結構
你的代碼。
但它實際上有 註釋的源文件
它允許你有點看。
這是真的很好 記錄，這是怎麼回事，
它是如何充實 Ajax功能
或事件的功能或 模型和集合排序
的解釋是什麼 在這個過程正在進行。
如果你明白 JavaScript的基礎知識
像原型繼承 和公正如何功能的使用
因為這兩個對象和值 和類和一切。
它使人們更方便 明白這是怎麼回事
對潛在的 您正在使用庫
和調試程序代碼，並能夠 不被敲打你的頭
靠在牆上，因為 你不明白是怎麼
不同的部分 在工作​​，所以。