>>所以，他这样说，
排序只是一个简单的 介绍了原型
和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的基础知识
像原型继承 和公正如何功能的使用
因为这两个对象和值 和类和一切。
它使人们更方便 明白这是怎么回事
对潜在的 您正在使用库
和调试程序代码，并能够 不被敲打你的头
靠在墙上，因为 你不明白是怎么
不同的部分 在工作​​，所以。