>> Так, с этим, как говорится,
только вид простой введение в прототипах
и модель JavaScript объект.
Мы не собираемся перекладывать шестерни немного поговорить
о более JavaScript на сервер и Книжная полка Библиотека
и соединение Knex Библиотека.
Таким образом, вы можете на самом деле просто -
если вы ищете Bookshelf.js это должно быть довольно легко
найти, должно быть первым результат, и Книжная полка
Давид упоминается только дает много структуры
вокруг объектов JavaScript и работать с ними реляционно
в реляционных базах данных.
Так, много сходных черт кто на самом деле сильно вдохновлен
по ORM Laravel в качестве а также Backbone.js,
который является передняя часть MVC библиотека, которая позволяет вам
структурировать ваш код, подобно тому, что я показывал
с примерами прототипы, где вы можете -
а не просто произвольно бросать занятия
из ваших мнений тут и там.
Это дает вам модели и сборники этих моделей
которые, как предполагается, в качестве рода единая точка истины
о данным за ваше приложение.
И тогда вы слушать, как те, Модели изменения, вы говорите, в порядке,
вновь вынести этот шаблон здесь и на этот раз здесь
а не просто добавить класс здесь, добавить класс там и своего рода подобрать
на селекторов и сделать Паутина JQuery кода.
Это дает больше на основе классов Структура для отдельных частей,
но важным компонентом что библиотека модели
которые имеют схожую структуру к тому, что модели на полку сделать.
Так что, если вы знакомы с Книжная полка вы довольно также
довольно хорошо знакомы с Backbone.js модели,
и я рекомендую взглянуть на это.
Так, некоторые из основных особенностей
что это дает вам всего лишь возможность установки данных на объекте
позвонить запросу, что возвращает отдельный запись
из базы данных, создать отношения как подобные
то, что вы имели дело в в Laravel
где вы можете сказать Пациент установить метод записи
и сказать, что это выиграл рекорд
где объект запись имя таблицы показатели здоровья.
Давайте посмотрим.
Имеет много - она ​​принадлежит -
просто вещи, которые вы очень похожи -
довольно хорошо знакомы с уже, но в JavaScript.
И под капотом, для книжной полке,
он использует построитель запросов называется Knex.js.
Итак, вот Knex, knexjs.org.
Это ссылка на игрушки, если кто-нибудь когда-либо играл с этим.
Но это позволяет - в Аналогичным образом, в JQuery,
Вы только вид создания цепь различных методов
что вы звоните на вашем запись в базе данных, так что вы можете -
Вы начали с того, Knex и имя таблицы.
Так, например, пользователи Knex, выбрать, какие столбцы нужно,
где, и имеют разные WHERE условные и вы можете иметь
И где, или там, где, где между ними, где нет,
Вы сейчас, по линии.
Вы можете указать разные присоединяется между таблиц базы данных
которые Книжная полка использует внутренне создать своего рода магии
вокруг hasOne, HasMany, принадлежит к, belongsToMany.
И поэтому комбинация
из двух позволить вам сделать довольно степени, что вы бы использовать
в рамках как Laravel с точки
функциональности работы с базами данных.
Итак, давайте идти вперед и принимать посмотрите на простом примере
для экспресс приложение, которое делает использование этих моделей
и сборники Книжная полка джаз [фонетические].
Так, я создал просто простое приложение здесь.
Я раздета некоторые вещи , который был инициализации экспресс
и двигаться, что в инициализации каталог, который я создал.
Одна из хороших вещей о работы с Экспресс как предполагалось
чтобы Laravel то, что есть действительно не очень в жизнь
на вас стилизованное.
Таким образом, вы можете создавать каталоги -
это действительно не дает вам много, чтобы отрабатывать.
У вас есть только вид некоторых основные параметры, а затем -
но это не волнует , где они находятся.
Вы не должны иметь Каталог контроллера.
Вам не нужно, чтобы иметь модели каталог, каталог конфигурации.
Вы можете сортировать, создать те, как ваши потребности проекта
и установить вещи путь что смысл наиболее важны для вас.
Так вместо того, все это экспресс шаблонный
в основных app.js я только что сказал приложение равно требуют инициализации / Экспресс.
И так в инициализации,
инициализации папка Я просто Экспресс здесь,
и это требует Express, звонки функция установки, называет -
настраивает вид двигателя, JSON парсер, все такое.
Так что теперь, давайте и дальше идти.
Так что я требующие Конечно инструктор встреча
и требования моделей.
Так что это в папке, Я просто решил моделей имен.
Это не обязательно должно быть способ, однако, это имеет смысл,
но модели просто довольно общий поэтому я рекомендовал бы его.
Но - Так пойдем для курса.
Я думаю, что я использую - Да, и примеры
здесь все основаны вокруг модели курса.
Так что давайте просто взять посмотрите на это.
Итак, теперь, только из Первая строка этой модели,
Я уже требует что-то еще.
Так что если вы заметите в узле Вы должны быть требующих
или вы собираетесь в конечном итоге требуя целый букет
из различных файлов , которые расположены
в разных местах в вашем приложении.
И относительные пути туда, где вы находитесь
в текущем приложении,
если это не верхний уровень уже определяется, как в установке его
с MPM как книжной полке или Knex или экспресс или что-то,
те не родственник.
Да? Увеличение больше?
ОК. ОК. Таким образом, вы будете в конечном итоге требует целый букет
просто разные файлы в Код, который хорошо и что плохо.
В хорошем смысле, вы знаете, где вещи, и это не своего рода
магии, как к тому, что происходит под капотом,
которые могут реально привести к путанице
когда у вас есть очень тяжелые Java -
или очень тяжелый рамки, как Laravel, какой вид говорит,
мы собираемся, чтобы заботиться это так у вас нет
требовать все но у вас есть
знать, как все работает для того, чтобы использовать его.
Где, как в данном случае, это очень просто, как в
где все, они просто концы
тем, что немного больше печатать.
Так же, как в стороне мне нравится в использовании, есть плагин
если вы используете слепой текст
где вы можете устанавливать узел Модули вспомогательные и вы можете начать
ввести как инструктор и он создает относительный путь
, где вы находитесь в том, что Код файл, вроде полезно.
Итак, модель конечно требует, здесь базу
а затем база стажер требуется инициализации / книжную полку
а затем Книжная полка, он требует верхнего уровня Книжная полка
а затем инициализирует его инициализации экземпляра Knex,
который задает имя клиента
и связь настройки для базы данных.
Так что я просто с помощью простой Экземпляр Сиквел Pro, который -
из MySQL, я к нему доступ с Сиквел Pro и она имеет только вид
аналогичного базе Установка, как мы имели
в первом примере приложения с каталогом курсов.
Так, я могу установить соединение настройки здесь,
и все они описаны на странице проекта Knex.js
о том, как установить эти связи.
Так, у меня теперь есть свой базовую модель.
И как я уже говорил с изменение прототип,
так что может на самом деле быть даже много, чтобы -
добавляет много шаблонного в код так конвенция
что была адаптирована по Backbone.js
и теперь Bookshelf.js является чтобы добавить это видео расширить метод
как статическое свойство Ваши объекты JavaScript,
что придает ему вид почти класс на основе характера наследования
где, если вы звоните расширить вы можете настроить любой
из способов-прототипов что вы хотели бы здесь
а затем вы можете - любая дополнительные статические методы
что вы, возможно, захотите, вы можете просто установить их сами
здесь, поэтому я могу продлить его с - это, если, например,
несколько моделей необходимо показать имя и этот получить имя.
Итак, вот, я говорю, отображаемое имя для модели
по умолчанию является то, что его имя Отель находится в противном случае возвращение
нет названия.
И теперь на каждый модель, которая представляет собой -
что расширяет эту базовую модель, я теперь есть метод отображаемое имя
на прототипе цепь где-то.
И если я хочу, чтобы перезаписать его Я могу просто установить его - установить, что -
GetName бы здесь.
И это позволяет имитировать классическая наследство
в JavaScript, которая может быть приятно частности для вещей
, которые поддаются быть Класс основан как объектных моделей.
Так что давайте перейти обратно в код приложения.
Так что я получил маршрут для всего слэш, только для моего индекса
а затем сократить курсы.
И оба эти призывают метод renderCourses.
Итак, еще раз, функции первый класс, и могут быть переданы
в качестве аргументов методов.
Так, в этом app.get, Я звоню -
Я передаю renderCourses в качестве аргумента.
И сделать - или функции может быть настроен как вар -
как я делал раньше вар renderCourses равна функцию
или они могут быть просто Функция renderCourses.
Это не делает слишком особой разницы.
Вы действительно можете есть то, что называются функции имя
выражения, которые VAR renderCourses равно
Функция renderCourses.
И, причина хотите иметь назвать функции особенно
в узле том, что он дает вам чище -
более удобным для чтения трассировки стека.
Так что если у вас есть целый букет
анонимных функций он будет говорить -
когда у вас есть ошибки в коде You'Ll -
вы не будете знать, какая функция это звонит вам придется искать
на номер кода и номер строки
и это иногда легче просто визуально разобрать
когда вы на самом деле имеют имена
для функций сами на стороне сервера.
Так что это renderCourses, давайте назовем узлов приложений -
так я слушаю на Ядро 3000 [фонетические].
И так все это делает правильно здесь просто становится все
курсы из базы данных.
Я даже не ограничивая его так он делает огромное количество
строк он возвращает.
И для того, чтобы сделать это,
от модели, конечно, есть является статическое свойство
называется коллекция.
И поэтому я просто назвать его - я сказал создать новую коллекцию
для этого курса, а затем скачать его,
, а затем вернуться курсы Коллекция здесь, в обетования.
Так внутренне, Дэвид в - Последняя половина учил немного
о обещания и обещания являются используется очень сильно и в Knex
и Книжная полка потому это предоставляет -
Это дает вам Способность иметь кучу
из различных асинхронные вызовы и как бы присоединиться, то вместе
или принести что-то, а затем
с вызовом другого асинхронный вызов базы данных
и вернуть эту ценность и затем перейти к следующему, то
а в следующем, то и тогда придется поймать в самом конце, чтобы разобраться
мимических асинхронный попытка поймать поведение с асинхронного кода,
потому что вы видите его сейчас
но это еще сложнее, как только вы начинаете иметь дело с ним.
Асинхронный код просто везде
в стороне сервера JavaScript и действительно в гораздо большей степени
чем вы привыкли к тому, если вы сделали наличие
на клиентской стороне.
Так что действительно, действительно помог вам там.
Но только, чтобы показать вам, отладчик заявление
что я говорил в инспектор инструменты узел,
Я собираюсь идти вперед и бросить отладчика линию здесь
в функции renderCourses и посмотреть, где, что приводит меня
когда я - так узла инспектор может быть установлен
делая НПМ Установить с флагом G,
что означает Global Узел инспектор.
И это принесу его для NMP и установить его глобально
для ваших приложений так что вы можете просто назвать его
из командной строки.
Я уже установлены так, чтобы я пойду вперед и -
на самом деле это, возможно, придется ждать его просто возьму,
займет пару секунд.
И то, что узел инспектор снова позволяет вам
сделать, это иметь этот обезглавленный версия консоли отладчика
что вы привыкли к при работе на стороне клиента и уметь
, чтобы остановить, просто добавьте указано указывает в коде.
Остановить выполнение и принимать посмотреть на то, что происходит,
которые бы действительно пригодиться, если функция
так были доступны
при отладке PHP код, я уверен.
Так что давайте просто взять посмотрите на это.
Так что я могу просто позвонить инспектор узел
и это скажу посетить этот URL порт 5858, чтобы начать отладку,
вот только по умолчанию за то, как она запускается.
Так что, я теперь получили - есть ничего не происходит здесь
потому что мне нужно, чтобы начать.
Так узел тупик [фонетические] флаг отладки, а затем app.js.
Так он говорит отладчик прослушивает порт 5858,
Экспресс слушающий сервер на 3000.
Так что мы хорошо идти.
Позвольте мне просто обновите это.
А теперь я вижу app.js код, который я просто смотрю на
но здесь, в консоли.
Так что теперь, если я пытаюсь запустить это, Вы можете видеть это, он останавливается.
Это только и ждут, потому что его Весь выполнение кода теперь
остановился на этом отладчик линия, которую я положил там.
И я теперь могу сервер -
[Неразборчиво Замечание]
О, да. Что такое ключевое слово ярлык для увеличения экрана?
О, есть.
Понял. ОК.
[Пауза]
О, это не смотрит [Фонетические], что.
Так, курсы действительно большой
потому что я не делаю ограничить пункт или что-нибудь,
это просто выборка Вся база данных курсов
которые многие из них.
А так - что объект
что на самом деле может привести к сбою экземпляр инспектор записка.
It's - ОК.
Позвольте мне сделать предел и то мы можем взглянуть
когда он не извлечение сотни курсов.
Так, убить сервер и инспектор
и я сделаю Course предел коллекция запрос 20.
Так, в книжной полке, в отличие от Laravel
где вы можете просто позвонить ограничить непосредственно или любым
из этих методов SQL что вы используете
непосредственно на экземпляре ORM.
В любое время, что вы используете только Способ SQL, который предусмотрен
в Knex, вы должны вызвать запрос для сортировки
из подключиться к цепи запроса.
И это может быть вызвано либо с функцией,
поэтому можно сказать,, функции этот предел 10 или вы это называете
, указав, которая метод вы хотели бы позвонить
на экземпляре Knex а затем, какое значение.
Так что мы собираемся делать ограничить 20, а затем установить.
Мы на самом деле не нужно отладчик здесь
потому что мы можем просто установить точки останова
и что делает его легче.
Хорошо.
Итак, давайте установить точку останова прямо здесь и попытаться загрузить его.
Неправильный линии.
Прямо здесь.
[Пауза]
ОК. Так что снова остановился.
Так что теперь, курсы является объект с длиной 20
и мы видим, все разные модели, что это за уши
из базы данных прямо здесь так у меня есть объект модели
который имеет, внутри атрибуты собственности
по объекту все вещи что он находится в базе данных.
Любые события, которые имеют было зарегистрировано
так что вы можете зарегистрироваться различные мероприятия,
например, когда модель находится в процессе удаления
или когда она быть уши,
можно задать разные свойства или изменять вещи.
Там очень много различных крючков и все они описаны
в Bookshelf.js документация, которые позволяют вам
сделать вид ничего что вы действительно хотите сделать
со своими моделями и коллекции.
Вы можете - они предназначены чтобы быть действительно настраиваемый
и просто для адаптировать их
к потребностям вашего Приложение.
Но только просматривая здесь,
Я вижу, что разные курсы доступны.
И в этом случае, я фактически не принести
с любыми другими данными, кроме всего сами курсы.
Но в аналогично Красноречивый ОРМ можно установить
до отношений, поэтому курс принадлежит многих инструктора.
Так что, если я иду вперед и остановить приложение,
перейти к такой запрос вызов, вы Можно указать различные параметры
что вы хотели бы донести до него.
И один из них является возможность загрузки соответствующий код
, указав withRelated инструкторы затем курсы.
Так давайте вернемся и свежий это здесь и остановиться.
Так что теперь, объект курсы, такое же количество моделей,
но теперь каждая модель имеет хэш отношений
который имеет инструкторов что это связано с.
Так что это, конечно, например
который является, конечно 082 имеет два связанные модели инструктор.
И вы уже можете увидеть, как гораздо легче это для сортировки
визуально работать, чем с когда вы имеете дело с вещами
что вы как бы изменить код а затем попробовать снова в PHP.
Тот факт, что вы можете просто полностью остановить выполнение
и оценивать то, что здесь и - в консоли, -
уменьшить масштаб, курсы, вы знаете,
что это локальная область переменные доступны
и это в настоящее время является глобальной Объект, потому что, как вы видели его,
если вы не звоните с конкретного контекста, он не собирается
иметь что-то соответствующую здесь.
И потом, - пусть мне показать еще несколько примеров
реализации обещания.
Таким образом, вместо того, чтобы делать это withRelated инструкторы здесь я
собираюсь идти вперед и двигаться в этом чтобы забрать, а затем курсы,
Я собираюсь вернуться courses.load инструкторы.
А потом - потом вы называете то.
[Пауза]
Так то в этой точке, курсы должны быть загружены
с инструкторами, которые является асинхронным действие.
Но потому, что мы ее возвращение от обещания, следующее значение
ибо тогда это все, что этот асинхронные возвращается вызовов
который в этом случае нагрузка является способ, в книжной полке
что на самом деле возвращает сама коллекция.
Так что это погрузки инструкторы на там
а затем вы можете указать - если это просто одно из свойств,
вы можете указать это в виде строки, в противном случае,
Вы можете сделать инструкторов и требования
как метод - извините, в виде массива.
А потом, если вы хотите, чтобы получить действительно фантазия и ограничить любой
из них дали выборок, вы можете указать его в качестве хэша
с инструкторами и что потом Вы хотели бы ограничить запрос на.
Итак, я хотел бы, чтобы загрузить все инструкторы на курсах, где -
так QB для построитель запросов где состояние активно.
И вы можете получить действительно фантазии с любым
из связанных запросов Вы хотели бы построить.
Но, только на данный момент, мы собираемся придерживаться всего инструкторов
и мы возвращаемся, что значение
так то в следующем затем следует есть все курсы загружалась
должным образом.
И если произошла ошибка на любом этапе этой цепи,
было бы спрыгнуть с уловом.
Так что давайте идти вперед и работать, что.
Таким образом, каждый раз - в отличие от PHP, один недостаток является
», Потому что узел" является давно работает Процесс, вам действительно нужно
, чтобы остановить процесс узла как вы обновить свой код,
поскольку версия, что это работает в период выполнения является,
версия Код, который был загружен
когда начал не что у вас есть своего рода
из обновили код с тех пор.
ОК. Мы установим точку останова здесь, здесь и обновления.
[Пауза]
О, я на самом деле не обновите эту страницу либо
так что это было на старом процесса.
Таким образом, вы обновить как это и инспектор узел.
Так что теперь мы видим, курсы.
Если мы просто взять образец одной из таких моделей,
мы видим, что отношения Объект пуст, но теперь -
и причина того, что вам нужно установить точки останова, ну,
Я упомянул, что вы можете прыгать в трассировке стека
и посмотреть, вы знаете, где он собирается в приложение.
Так что теперь я могу видеть то, что происходит в методе нагрузки,
которые я определил о коллекциях.
Он вроде как "Стремясь нагрузки отношения на уже ".
И вы можете пошагово и посмотреть, строка за строкой
где этот материал собирается и это здорово.
Если у вас есть что-то что не работает в коде,
это бросает ошибку и вы, как я действительно хочу
чтобы увидеть, где это происходит.
Но как только вы столкнетесь с что-то асинхронный, -
он идет к другому отметьте из цикла событий
и ты потеряешь свою - Вы теряете свое место
в инспекторе узла.
Таким образом, вы должны сказать, "Хорошо, только я потерять это,
он должен остановить сейчас на этой линии еще раз. "
Потому что если я продолжал поражать вниз, вниз по стеку,
она должна была бы в конце концов просто ушел бы я не установить это
линии 22 синюю линию разрыва.
Так что теперь, если я смотрю на курсах здесь,
он должен на отношение инструкторы
а затем инструкторы прикрепить их.
Таким образом, вы можете видеть, что я вернулся обещание от первого обещания
а затем вы можете постоянно сделать это по линии.
Таким образом, разные обещания, обещают библиотеки,
Я использовал один называется Bluebird который является действительно полезным.
Это добавляет много приятно это для изменения асинхронный -
изменения перезвонить базовый код в материал
что хорошо работает с обещаниями.
Но - жаль [неразборчиво], что Я собирался сказать это там.
Давайте взглянем хотя в -
так скажем, что существует Проблема при выборке что-то.
Поэтому у меня есть этот другой маршрут найти под названием курса ID.
Так давайте сделаем курс 2.
Могу ли я получить - JSON курс.
И это делает [неразборчиво].
[Пауза]
Я чувствую запах что-то не так здесь.
Не на 3000, я был на инспектор вкладка Chrome.
ОК. Так что давайте идти в Конечно - JSON Конечно 1.
И это возвращает только в JSON Формат, конечно загружен
с некоторыми преподавателями.
Но пример я хотел дать здесь является то, что,
Я делаю JSON курса ID.
И в выборку параметров, Я и указывается, требуется верно,
который является вариант, который задокументированы в книжной полке
где он говорит, что: "Если, Я попытаться найти этот курс
и это не там, затем выдаст ошибку ".
И это должно быть пойман улов блокировать сюда.
Так что давайте идти вперед и вернуться назад в инспекторе узла и попробуйте
и сломать это и посмотреть, что мы получили.
Так давайте установим перерыв здесь, на процессе JSON.
Хорошо.
Я пойду в JSON конечно и Я бы просто положить в некоторых -
[Пауза]
Это может быть немного сложнее иногда, когда вы пытаетесь
управлять которой один был обновлен
и которые имеют не - посмотрим.
Так что звонит ошибку пустой ответ.
[Пауза]
Давайте бросить отладчик здесь.
Потому что, как узел фактически оптимизирует
для выполнения JavaScript настолько быстро на сервере,
иногда узел отладчик имеет некоторые ошибки при попытке
и установить точки останова динамически и вы на самом деле нужно
использовать отладчик и не линия за линией.
Итак, давайте посмотрим, если это получает нас, что мы хотим.
Поэтому я, app.get JSON Конечно ID,
и я установил мой отладчик есть
в заявлении на вылов в нижней части.
Fetch требуют правда, надо - Все в порядке, там мы идем, сломался.
Итак, теперь я вижу, что он остановился
в этом последнем улове блока потому что withRelated -
или потому, что требуют верно определены и нет конечно
с ID этого большой число путем изъятия из
который в настоящее время Emessage.
И каждая ошибка в JavaScript имеет свойство стека
, который поставляется вместе с ним.
Так довольно часто бывает полезно Для например,
утешить выйти e.stack.
И я могу реально увидеть когда я ударил ошибку.
Так что я получаю ошибку пустой ответ, что это сообщение
который был отправлен через Книжная полка.
Но теперь, я могу взглянуть в, при заходе стека и увидеть
, что в книжной полке диалекты SQL модель 83,
это пустое ответ Ошибка была брошена.
И это то, где я упоминалось, это точка анонимно
потому что это анонимный функция.
Если бы это было функцией название вам придется лучшие идеи
к которой функционируют фактически через, не прибегая к
в код model.js.
Хотя это предназначается, чтобы быть довольно, довольно читаемым,
так что я могу видеть, что в Интернете.
Что они говорят мне было линии 83.
Так что, если options.require и ответ не существует,
теперь бросает новый пустая ошибка ответ.
Таким образом, вы можете видеть довольно просто, как это работает.
И внутренне в книжной полке,
там просто в целом куча использования обещаний.
Таким образом, вы можете указать Promise.method
с Bluebird библиотеке который держит правильный контекст
это при возвращении обещание.
И поэтому я - я связывания Значение этого аналогичный
к тому, что я упомянул ранее, но с использованием обещания
и тогда я могу - это новая.
Это может быть асинхронный или нет, если я хочу.
А потом я сделать некоторые другие вещи, которые могут
быть или не быть асинхронными и то виды прыжков вниз это.
Так Promise.all является вспомогательным, что много популярных библиотек имеют
где вы можете иметь массив потенциально может
быть или не быть обещания.
И как только все те завершена, вы вернетесь, что
а затем он прыгает к следующей строке
и вы можете увидеть, как на самом деле выравнивается пирамиду
что вы получите, обратного вызова, черт возьми, как его известный
если вы делаете все с обратные вызовы строка за строкой.
Есть способы, чтобы обойти это, но обещания являются одним
из лучших способов, на мой взгляд
чтобы действительно поддерживать вашу код чистым и легким для чтения.
Так что это всего в нескольких минутах Введение в JavaScript
и Книжная полка и Knex в целом.
И, если есть какие-либо вопросы, Я знаю, что тонна материала
к виду попытаться крышка тем более, что на языках,
в отличие от большинства, что вы знакомы с так что я просто хотел
сделать так, чтобы по крайней мере если у вас возникли проблемы
с вашим кодом, вы может рода скачок -
это то, что мне нравится делать, это рода прыгнуть в библиотеках
что я использую и посмотреть, как вещи устроены.
Там одна, что я упомянул ранее назвал Backbone.js
и на самом деле это [Неразборчиво] на стороне клиента
чтобы помочь дать вида модели Структура управления
в код.
Но это на самом деле имеет аннотированный источник документации
которая позволяет сортировать, видят.
Это действительно хорошо документально, что происходит,
как это увеличения функциональность Ajax
или функциональность событие или модели и коллекции рода
объяснить то, что происходит в процессе.
И если вы понимаете, основы JavaScript
как прототипных наследования и просто, как используются функции
как обоих объектов и ценностей и классы, и все.
Это делает его намного проще чтобы понять, что происходит
на потенциально в библиотеки, которые вы используете
и код отладчик и уметь чтобы не быть биться головой
к стене, потому что Вы не понимаете, как
различные части работают, так.