>> Така че, с това се каза,
просто нещо като прост въведение към прототипи
и обектния модел на JavaScript.
Ние няма да се смени предавки малко да говори
за повече JavaScript относно сървъра и Bookshelf библиотека
и връзката Knex библиотека.
Така че, можете да всъщност просто -
ако търсите Bookshelf.js тя трябва да бъде доста лесно
да се намери, трябва да бъде първи резултат на това и Bookshelf
като David спомена само дава много структура
около JavaScript обекти и работа с тях във взаимоотношенията
в релационни бази данни.
Така че, много сходни характеристики кой е всъщност силно вдъхновен
от ORM Laravel като както и Backbone.js,
което е пред края MVC библиотека, която ви позволява
за структуриране на кода си, подобно на това, което показваше
с примери за прототипи, където можете да -
вместо просто произволно хвърляне класове
на вашите мнения тук и там.
Тя ви дава модели и колекции от тези модели
които се очаква да действат като сортиране на една-единствена точка на истината
за данните за Вашата кандидатура.
И тогава можете да слушате, като тези модели промени, вие казвате, OK,
отново направи този шаблон тук и този един тук
а не просто добавете клас тук, добави клас има и нещо като мотика
на селектори и да направи паяжина на JQuery код.
Той дава повече от един клас-базирани структура на отделни парчета,
но важен компонент на тази библиотека е моделите
които имат сходна структура за това, което правят модели лавица.
Така че, ако сте запознати с Етажерка сте доста също
доста запознати с Backbone.js модели
и аз бих препоръчал като погледнете това.
Така, някои от основните характеристики
че тя ви дава са само способността да се определят данни за даден обект
да се обадя донесе, които връща отделен запис
от базата данни, да създавате отношения като подобни
на това, което се справиха в рамките на Laravel
, където можете да се каже пациент определен метод рекорд
и да кажа това е носител на рекорд
когато обектът е рекорд име на таблица здравни досиета.
Нека да видим.
Има много - тя принадлежи към -
просто неща, които сте доста сходна -
доста запознати с вече, но в JavaScript.
И под капака, за Bookshelf,
той използва заявка строител наречен Knex.js.
Така че, това е Knex, knexjs.org.
Това е препратка към играчката, ако някой някога е играл с това.
Но тя ви позволява да - в подобен начин, за да Jquery,
просто някак се създаде верига на различни методи
че се обаждате на вашия ред база данни, така че можете да -
ти започна с думите, Knex и името на таблицата.
Така например, Knex потребители, изберете кои колони искате,
където и да имат различен където условностите и можете да имате
И къде, или когато където между, където не
вас сега, за установяване на ред.
Можете да зададете различен присъединява между вашите таблици на базата данни
които Bookshelf използва вътрешно да се създаде нещо като магия
около hasOne, hasMany, belongsTo, belongsToMany.
И така, комбинацията
на две ви позволи да направите доста много какво искате да се използва
в рамка като Laravel по отношение
на функционалност работа с бази данни.
Така че, нека да вървим напред и да се разгледаме един прост пример
за Express ап които прави използването на тези модели
и сборници от Bookshelf джаз [фонетично].
Така че, аз съм създаден само просто приложение тук.
Съблякох някои от нещата, че е инициализиране изричното
и да се премести, че в един първоначален директория, която съм създал.
Едно от хубавите неща за работа с Express както се предполага
да Laravel е, че има наистина не е много в сила
на вас и условен.
Така че можете да създавате директории -
наистина не ви даде цяло много да се работи на разстояние от.
Трябва някак си някои основни настройки и след това -
но тя не се интересува къде сте ги сложили.
Вие не трябва да има указател на контролера.
Не е нужно да има модели директория, а довереник директория.
Можете да се създаде нещо като тези, както на вашите нужди проекта
и се определят нещата по начина, по който че да има смисъл най-много за вас.
Така че, вместо да се налага всички това изрично шаблон
в основните app.js току-що казах ап равни изискват първоначален / Express.
И така, в първоначален,
инициализиране на папката Току-що са Изразете тук,
и това изисква Express, разговори функцията за настройка, нарича -
създава оглед двигателя, JSON анализатор, всичко това.
Така че сега, нека да продължи надолу.
Така че аз съм изискваща Разбира инструктор среща
и изисквания модели.
Така че те са в папка, която Аз просто реших да име модели.
То не трябва да бъде, че начин обаче тя има смисъл,
но модела е само хубави обща, така че аз бих го препоръчал.
Но - Така че нека да отидем за време.
Мисля, че аз съм с помощта - Да, а примерите
всички тук са базирани около модела на курса.
Така че нека просто да вземат Един поглед към това.
Така че, сега, точно на първа линия на този модел,
Аз съм вече, изискваща нещо друго.
Така че, ако вие ще забележите, в възел трябва да бъдат изискваща
или започваш да се свърши изискваща цял куп
на различни файлове , които се намират
в различни места във вашето приложение.
И относителната пътеки до където и да сте
в сегашния си молба,
освен ако не е най-високо ниво вече дефинирани, както в който да го инсталирате
с MPM като полица за книги или Knex или Express или нещо такова,
тези, които не са относителни.
Да? Zoom в повече?
OK. OK. Така че, ти започваш да се в крайна сметка се изисква един куп
просто различни файлове на вашия код, което е добро и лошо.
В добрия смисъл, че знаете къде неща са и това не е нещо
магия за това какво е става под капака,
който наистина може да бъде объркващо
, когато имате много тежък Java -
или много тежка рамка като Laravel, който казва нещо,
ние ще се погрижим на това, така че не е нужно
да изискват от всичко но имате
да знаете как всичко работи, за да го използвам.
Когато, както в този случай, това е много ясно, че да се
където всичко е, те са просто краища
сметка е малко по машинопис.
Точно както в страната ми харесва да се използва, има един плъгин
ако използвате сляпо текст
, където можете да се настанявам на възела модули помощник и можете да започнете
да въведете като инструктор и тя създава относителния път
до мястото, където сте с тази код на файла, нещо полезно.
Така че, модела на курса е изискваща база тук
и след това база стажант изисква първоначален / етажерка
и след това на лавица, той изисква лавица за книги на най-високо ниво
и след това да го инициализира с инициализираната Knex инстанция,
която съдържа името на клиента
и връзката настройки за базата данни.
Така че аз съм само с помощта на проста Например на Sequel Pro, които -
на MySQL, аз съм достъп до него с Sequel Pro и има само сортиране
на подобна база данни настройка като имахме
в първото заявление проба с каталога разбира се.
Така че, аз поставям връзка настройки тук
и всички те са документирани на страницата на проекта Knex.js
за това как да настроите тези връзки.
Така че, аз сега имам моя базов модел.
И както споменах с Промяната на прототип,
така че да може действително е вид много да -
добавя много на шаблон да си код, така конвенция
че е адаптиран от Backbone.js
и сега е Bookshelf.js да добавите този удължи метод
като статична имот на Вашите обекти JavaScript,
което му придава вид на почти клас-базирани наследство природата
където, ако ти се обадя удължи можете да настроите всеки
на методите за прототипни че искате тук
и след това можете да - всеки допълнителни статични методи
, че може да искате, можете просто да ги зададете сами
от тук, така че аз мога да го удължи с - така че, ако например,
необходими няколко модела покаже името и това получи името.
Така че, ето, аз казвам, че дисплей име за модел
по подразбиране е това, което името му собственост е друго завръщане
без име.
И сега на всеки модел, който е -
която се простира този базов модел, I Сега имате метод име дисплей
на прототипа верига някъде.
И ако искам да го презапишете Просто не мога да го определя - комплект какво -
getname нямаше да съм тук.
И това ви позволява да имитират класическото наследство
в JavaScript, който може да бъде хубаво специално за неща
, които се поддават самите те да са клас на базата като обектни модели.
Така че нека да скочи обратно в кода на приложението.
Така че аз имам маршрут за само наклонена черта, само за моя форум
и след това наклонена черта курсове.
И двете от тях се обаждате метод renderCourses.
Така че отново, функции са първи клас и може да бъде прехвърлено
като аргументи към методи.
Така че, в този app.get, Обаждам -
Аз съм преминаване renderCourses като аргумент.
И направи - или функции може да бъде настроен като VAR -
както правех по-рано VAR renderCourses равнява функция
или те могат да бъдат само функционални renderCourses.
Той не прави твърде голяма част от разликата.
Вие всъщност може да има това, което се нарича име на функция
изрази, които са VAR renderCourses равни
функционални renderCourses.
И причината да искам да имам назове функции особено
в възел е, че дава по-чиста -
по-разбираеми стак следа.
Така че, ако имате един куп
на анонимни функции тя ще каже -
, когато имате грешка в кода си You'Ll -
вие няма да знаете, които функционират тя се обажда, че ще трябва да се търси
на кодовия номер и номера на реда
и понякога е по-лесно просто визуално да се анализира
, когато всъщност имат имена
за функциите себе си на сървъра страна.
Така че това, renderCourses нека наречем приложения възли -
така че аз съм слушане на Ядро 3000 [фонетично].
И така, всичко това се прави в тук е просто получаване на всички
курсове от базата данни.
Аз не съм дори да го ограничават така че това прави огромен брой
редове, това е връщане.
И за да направите това,
от модела на Разбира се, има е статична имот
нарича колекция.
И така, аз просто го наричат ​​- I каза създаде нова колекция
за това, разбира се, и след това да го вземе,
и след това се върнете на курсовете събиране тук в обещанието.
Така вътрешно, David в - на последния половин научи малко
за обещания и обещания са използва много силно и в двете Knex
и Bookshelf защото тя придава на -
Тя ви дава на способността да има един куп
на различни асинхронни разговори и някак се присъединят след това заедно
или донесе нещо, а след това
с този призив друг асинхронен база данни повикване
и да се върнете на тази стойност и След това преминете към следващия след
и следващия след това и след това да има хване в самия край, за да сортирате
на мимическата асинхронен пробвам улов поведение с асинхронен код,
защото сте го виждаме сега
но това е още по-трудно, след като да започнете да се справят с нея.
Asynchronous код е просто навсякъде
в страна на сървъра JavaScript и наистина в много по-голяма степен
отколкото сте свикнали с тях, ако сте направили JavaScript
от страна на клиента.
Така че наистина, наистина ти помогна там.
Но само за да ви покажа отчета за дебъгер
че аз говорех за в инспектор инструменти възел,
Отивам да вървим напред и хвърлят дебъгер ред тук
във функцията renderCourses и да видим къде, което ме води
когато I - така възел инспектор може да бъде инсталиран
чрез правене NPM Install с G флаг,
което означава, Global Инспектор Node.
И това ще го вземе за NMP и да го инсталирате в световен мащаб
за вашите приложения така че може просто да го наречем
от командния ред.
Аз вече сте инсталирали то така че аз ще отида напред и -
всъщност тя може да има да се изчака тя просто ще взема,
вземат две секунди.
И какво възел инспектор отново ви позволява
да направите, е да получите този обезглавеното версия на конзолата дебъгер
че сте свикнали при работа от страна на клиента и да бъде в състояние
да спре, просто добавете е посочено посочва в кода си.
Спрете изпълнение и да вземе вижте какво се случва,
което би имало наистина дойде по-удобно, ако функцията
като че са били на разположение
когато коригирането на грешките в PHP код сигурен съм.
Така че нека просто да вземат Един поглед към това.
Така че мога само да се обадя инспектор възел
и тя ще каже посетите този URL порт 5858 да започне отстраняване на грешки,
това е просто по подразбиране за това как да го стартира.
Така че, аз съм сега имам - има нищо не става тук
защото трябва да започне.
Така възел безизходица [фонетично] на отстраняване на грешки флаг и след това app.js.
Така се казва дебъгер слушане на порт 5858,
Express сървъра слушане на 3000.
Така че ние сме добре да тръгвам.
Нека само да обновите тази.
И сега мога да видя app.js код, който аз просто гледам на
но тук в конзолата.
Така че сега, ако се опитам да изпълня този, можете да го видите, да го спира.
Тя просто чака, тъй като неговата цялото изпълнение на код сега е
спря на този дебъгер линия, която съм поставил там.
И аз сега мога сървър -
[Безшумен Забележка]
О, да. Какво е ключовата дума пряк път към увеличение на екрана?
О, има.
Взех го. OK.
[Pause]
О, той не търси [Фонетично] това.
Така че, курсове е много голямо
защото аз не правя ограничат клауза или нещо подобно,
това е просто извличане на Цялата база данни на курсове
, които са много на тях.
И така - който е обект
, че всъщност може да се срине на бележката инспектор инстанция.
Това е. - OK.
Позволете ми да направя едно ограничение и тогава ние можем да погледнем
когато не е привлекателен стотици курсове.
Така че, убиват сървъра и инспектор
и аз ще направя, разбира се граница заявка колекция 20.
Така че, в Bookshelf, за разлика от Laravel
където може просто да се обадя ограничи директно или се обадете на всеки
на тези методи SQL , които се използват
директно на инстанция ORM.
Anytime, че използвате само SQL метод, който се предоставя
в Knex, трябва да се обадете се на заявката, за да сортирате
чешмяна в мрежата за заявки.
И това може да бъде ползвана с или функция,
така че може да се каже, функция това ограничение 10 или ще го наречете
чрез определяне на които метод, който искате да се обадите
на инстанция Knex и след което стойност.
Така че ние ще направим ограничаване на 20 и след това да настроите.
Ние всъщност не правя трябва дебъгер тук
защото можем просто определени точки на прекъсване
, което я прави по-лесно.
Добре.
Така че, нека да зададете точка на прекъсване точно тук и се опитайте да го заредите.
Wrong линия.
Точно тук.
[Pause]
OK. Така че отново спря.
Така че сега, курсове е обект с дължина от 20
и ние може да видите всички различни модели, че това е пресилено
от базата данни тук така че аз имам модел обект
което има вътре в атрибути имот
върху обекта, са всички неща, че го е намерил в базата данни.
Всички събития, които имат е било регистрирано
така че можете да се регистрирате различни събития,
например, когато модел се заличава
или, когато е е пресилено,
можете да зададете различен свойства или променят нещата.
Има много различни куки и всички те са документирани
в Bookshelf.js документация, която ви позволява
да се направи нещо като нищо , че наистина искате да направите
с вашите модели и колекции.
Можете да - те са замислени да бъде наистина адаптивни
и много лесно за можете да ги адаптират
на нуждите на вашата приложение.
Но просто гледам от тук,
Мога да видя какво различното курсове са на разположение.
И в този случай, аз всъщност не донесе
с други данни, различни от само на самите курсове.
Но по подобен начин да се красноречивия ORM можете да зададете
отношенията, така че курса принадлежи към много инструктор.
Така че, ако отида напред и да спре прилагането,
скочи до този донесе повикване, да укажете различни опции за
че искате да мине покрай него.
И един от тях е способност за натоварване, свързани с кода
чрез определяне withRelated инструктори тогава курсове.
Така че нека се върнем и свеж това тук и да се спре отново.
Така че сега, курсовете възразяват, същия номер на модела,
но сега всеки модел има хеш отношения
който има инструкторите че това е свързано с.
Така че този курс за пример
което е, разбира се 082 има две свързани инструктор модели.
И вие вече може да се види как много по-лесно е да се справи
на визуално работи с над когато имаш работа с неща
че сте нещо като смяна на кода и след това опитайте отново в PHP.
Фактът, че можете просто да спре изпълнението изцяло
и оценяват това, което е тук и , - при конзола, на -
отдалечаване, курсове е, вие знаете,
какво, че местната обхвата променливи са достъпни
и понастоящем това е глобалното обект, тъй като го видях,
освен ако не ти се обадя с специфичен контекст, то не става
да има нещо от значение тук.
И тогава - Let Me покаже още няколко примера
прилагане на обещания.
Така че вместо да правиш това withRelated инструктори тук съм
ще отида напред и да се премести тази да донесе и след курсовете,
Отивам да се върне courses.load инструктори.
И след това - тогава ти се обадя после.
[Pause]
Така че след това в този момент, курсове трябва да се заредят
с инструктори, които е асинхронно действие.
Но тъй като ние сме го връщат от обещание, следващата стойност
защото тогава е това, каквото и асинхронни връща кол
което в този случай натоварването е метод, при Bookshelf
че всъщност се връща самата събирането.
Така че това е зареждането на инструктори там
и след това можете да посочите - ако това е само един имот,
можете да зададете този като низ, в противен случай,
можете да направите инструктори и изисквания
като метод - Съжалявам, като масив.
И след това, ако искате да получите наистина фантазия и да ограничи всякакъв
от тях дава Извлича, вие може да го посочите като хеш
с инструктори и после какво Искате ли да се ограничи заявката за.
Така че, бих искал да се зареди всичко инструктори на курсове, където -
така QB за заявка строител където състоянието е активна.
И вие можете да получите наистина фантазия с всеки
на свързаните заявки искате да се строи.
Но, само за сега, ние ще да се придържаме към само инструктори
и ние връщаме тази стойност
така след това на следващия тогава трябва имате всички курсове заредени
правилно.
И ако е имало грешка във всеки един етап от тази верига,
тя ще скочи до улова.
Така че нека да вървим напред и да тичам, че.
Така че всеки път - за разлика от PHP, един недостатък е
"Защото възел" е дълго бягане процес, действително имате нужда
да спре процеса на възел както можете да актуализирате вашия код,
защото версията, че това е работи във времето от серия е,
Версията на код, който се зарежда
когато не е започнал това, което имате на сортиране
на актуализираните си код с оттогава.
OK. Ще зададете точка на прекъсване тук, тук и опресняване.
[Pause]
О, аз всъщност не направих обновите тази страница или
така че е на възраст процеса.
Така че ви освежи както това и инспектора на възела.
Така че сега ние виждаме курсове.
Ако ние просто вземат проба на един от тези модели,
можем да видим, че отношенията обект е празен, но сега -
и поради това, че имате нужда от до определени точки на прекъсване, е, добре,
Споменах, че можете да скочи в следата стак
и да видим знаете ли, където то се случва в приложението.
Така че сега мога да видя какво е случва в метода на натоварване,
което аз съм определено на колекциите.
Някак "Винаги на товари взаимоотношения върху вече ".
И вие можете да преминете през и да видим ред по ред
където тези неща е ще, което е страхотно.
Ако имате нещо че е счупен в кода си,
това е хвърляне на някаква грешка и вие сте като аз наистина искам
, за да видите, когато това се случва.
Но веднага след като се сблъскате с нещо асинхронен, The -
тя преминава към следващата отбележете на контура на събитие
и вие ще изгубите - губите си място
в инспектора на възела.
Така че ще трябва да се каже, "ОК, щом загубим този,
тя трябва да спре сега най отново тази линия. "
Защото ако аз продължавах да удря надолу, надолу в стека,
тя ще трябва в крайна сметка просто изчезнало, ако не задам този
ред 22 синьо пауза линия.
Така че сега, ако аз гледам в курсове тук,
би трябвало по отношение инструктори
и след това има инструктори ги отдават.
Така че, можете да видите, че аз се върнах обещание от първото обещание
и след това можете да постоянно направи това за установяване на ред.
Така различните обещанието, Обещавам, библиотеки,
Аз използвах една, наречена Bluebird което е наистина полезно.
Тя добавя, много мило от това за промяна асинхронни -
променя обратно позвъняване база код в неща
, който работи добре с обещания.
Но - Съжалявам [недоловим] какво Щях да го кажа там.
Нека да разгледаме макар и в -
така че нека да кажем, че е имало проблем при извличането на нещо.
Така че аз имам този друг маршрут да намерите нарича разбира ID.
Така че нека да направим курс 2.
Мога ли да получа - JSON разбира се.
И това прави [недоловим].
[Pause]
Надушвам нещо не е наред тук.
Не и в 3000, аз бях на инспектор раздела Chrome.
OK. Така че нека да отидете на Разбира се - JSON курс 1.
И това се връща само в JSON формат, курсът зареден
с някои инструктори.
Но примерът Исках да се даде тук е, че,
Аз правя JSON разбира ID.
И донесе параметри, Аз съм уточняване изисква вярно,
което е една опция, която е документирано в Bookshelf
където се казва, че: "Ако, Опитвам се и да намерят този курс
и това не е там, След това хвърля грешка. "
И това трябва да бъдат уловени от улова блокира тук.
Така че нека да вървим напред и да се върнете назад в инспектора на възела и опитайте
и се разбие и видим какво имаме.
Така че нека да зададете пауза тук на хода JSON.
Добре.
Аз ще отида да JSON курс и Бих просто пуснати в някои -
[Pause]
Тя може да бъде малко трудно понякога, когато се опитвате
за управление, които един е освежени
и които не са - нека да видим.
Така че се обажда грешка празен отговор.
[Pause]
Нека хвърлим дебъгер тук.
Поради как възел всъщност оптимизира
за време на изпълнение на JavaScript да бъде толкова бързо, на сървъра,
понякога дебъгер възел има някои грешки, когато се опитате
и определени точки на прекъсване динамично и всъщност се нуждаем
да се използват за корекция на грешки и а не ред по ред.
Така че нека да видим дали това ни получава това, което искаме.
Така че тръгнах, app.get JSON разбира ID,
и съм задал ми дебъгер там
в отчета за улов в дъното.
Изважда изисква вярно, то трябва - Всичко е наред, няма да отидем, счупи.
Така че, сега мога да видя че спря
в този последен блок улов защото withRelated -
или защото изисква истинска сила определен и няма разбира се
с ID на този голям брой през изключение
която сега е Emessage.
И всяка грешка в JavaScript има стак имот
, която идва заедно с него.
Така че това е често полезен да например,
утеши излезете e.stack.
И всъщност мога да видя когато ударих грешка.
Така че аз получавам грешка празна отговор, че това е съобщението
че беше изпратена чрез Bookshelf.
Но сега, аз мога да погледна в, при повикване стека и да видим
че в Bookshelf диалекти SQL модел 83,
тази празна отговор грешка е хвърлен.
И това е мястото, където споменах, това е точка анонимен
защото това е анонимен функция.
Ако това беше една функция име вие ще имате по-добри идеи
към който функционира в действителност чрез без да се налага да отидете
в кода на model.js.
Въпреки, че тя е трябвало да бъде доста, доста четивна,
за да мога да видя, че онлайн.
Какво казват Аз бях линия 83.
Така че, ако options.require и отговорът не е съществувал,
сега хвърля нова празно грешка отговор.
Така можете да видите доста ясно как това работи.
И вътре в Bookshelf,
има си просто едно цяло куп използване на обещания.
Така че можете да укажете Promise.method
с Bluebird библиотеката която поддържа правилното контекста
на това, докато се върне обещание.
И така, аз съм - аз съм задължителен стойността на този подобен
на това, което бях споменат по-горе, но при използване на обещания
и след това мога да - е нещо ново.
Тя може да бъде асинхронни или не, ако искам.
И тогава аз се направят някои други неща, които могат
или не може да бъде асинхронни и тогава видове скокове надолу това.
Така Promise.all е помощник, че много от популярните библиотеки имат
, където можете да имате масив на потенциално може
или не може да бъде обещания.
И след всичко това са приключила, вие се върнете, че
и след това тя скача на следващия ред
и можете да видите как тя наистина изравнява пирамидата
че можете да получите, за обаждане ада като неговия известен
ако правиш всичко с обратни извиквания ред по ред.
Има начини да се придвижват това, но обещанията са едно
от най-добрите начини, по мое мнение
наистина да поддържате кода чист и лесен за четене.
Така че това е просто един кратък Въведение в JavaScript
и етажерка и Knex като цяло.
И, ако има някакви въпроси, Знам, че е един тон на материала
някак да се опита и капак особено след като езиците,
за разлика от повечето, които сте запознати с така че аз просто исках
да го направят, така че най-малко ако имате проблеми
с вашия код, можете може някак да скочи в -
това е, което обичам да правя, е вид скочи в библиотеките
че аз съм с помощта и да видим как нещата са структурирани.
Има една, която бях споменат по-рано нарече Backbone.js
и всъщност това е [Недоловим] от страна на клиента
да помогне да даде модел оглед структура контролер
до вашия код.
Но всъщност има анотирани източник документация
която ви позволява да видите нещо.
Това е наистина добре документирано, какво става,
как се засилвайки функционалността Ajax
или функционалността на събитието или на модели и колекции вид
обясни какво е става в процеса.
И ако сте разбрали основите на JavaScript
като prototypal наследството и колко са използвани функции
като обекти, така и ценности и класове и всичко.
Това го прави много по-лесно да се разбере какво се случва
на потенциално на библиотеки, че използвате
и дебъгер код и да бъде в състояние да не се чука главата си
срещу стената защото ти не разбираш как
различни парчета работим, така.