>> Добре.
Так захоплюючим було, що є node.js, як ви його знаємо сьогодні?
Є що-небудь? Так?
>> Це було схоже рамки написання JavaScript
додатки широкому сенсі -
>> ОК, що працює.
>> - Я знаю, як поширені види, такі як -
або щось вам можете зробити, це як -
[Нерозбірливість Зауваження]
>> ОК добре.
Так, так що це основа.
Це двигун, за допомогою якого ви може виконувати код JavaScript
Сервер сайту.
Це може означати, найпростіших речей
як написання командного рядка сценарій не в Python або Bash
або Рубі або PHP, а просто в самій JavaScript
і виконання його на блимати командний рядок.
Або ви можете реально працювати це усередині веб-сервера.
І справді в межах node.js сам,
ці рамки ціла купа бібліотек серед яких
в HTTP сервера вбудовані.
Таким чином, ви можете насправді писати сервер як ми побачимо
через хвилину, супер легко , Просто для розуміння трохи
з HTTP і TCP і портів.
І ви можете породити прослуховування веб-сервер без Apache,
без Microsoft, IIS.
Без будь-якої іншої встановлене програмне забезпечення,
ви можете просто нерест це і слухати більшою будь-якому порту
на системи, які Вам дозволяють.
Так справа і вказує, відпусти мене і відкрити
до цього, наприклад, сервер-0.js.
Так помітити, що верхня частина цей файл, просто купа
з нецікавих коментарів, а потім є кілька
представницьких рядків коду що ми побачимо recurringly.
Так, змінна HTTP отримує вимагають «HTTP».
Так, вбудована в node.js ' інфраструктура цілий букет
модулів, які насправді просто бібліотеки і все начебто
з простору імен з унікальний ідентифікатор
як це одне «HTTP».
Так що, як і в багатьох Мови, як Java і C + +
і C, тільки коли ви імпортувати або включати
або у вузлі говорити вимагають модуль робить свої біти.
І вся пам'ять потрібно отримати завантажені
в оперативну пам'ять і тому використовується.
Так, ви як би завантажити це бібліотеки або модулі за запитом.
Це означає, йти вперед і вимагають
для цієї програми HTTP бібліотека,
і відносяться до цієї бібліотеці на спосіб змінної з ім'ям HTTP.
Але цей символ ліва міг були названі нічого, Foo,
бар, Баз, це не має значення.
Так на відміну від C + + і Java і С, де, коли вам потрібно
або імпортувати бібліотеку, це тільки вид
з стають доступними всьому світу,
Node.js модулі більш щільно імен.
Так що самостійно - що функціональність доступний тільки в той момент,
через цей ім'ям змінної.
Ви не можете просто почати методи типування, які існують
в ньому прямо шлях який, ймовірно, добре,
бо тоді ваш імен не отримує майже стільки метушню
як у багатьох мовах.
Гаразд, так що тепер в якості загального запропонувати, створюючи HTTP сервер
як Джонатан [передбачається написання] вдалося буквально
як просто, як виклик створити метод сервера всередині
модуля HTTP.
Таким чином, це повертається посилання
до якогось веб-сервера.
Він прийшов до Apache, що не обов'язково як важку вагу.
Це одне це трохи простіше.
А тепер, я повинен просто просто зробити кілька речей.
Отже, спочатку, дозвольте мені прокрутки на дно тут
і пропустити обробник Метод на мить.
І зауважте, цей рядок коду,
server.on що по суті означає, сервер -
слухати, як в JQuery код,
слухати для події називається запитом
і просто зробити припущення що мені робити
коли подія запит пожежі в сервері.
Так?
>> Викличте обробник функції.
Так, буквально виконати код, який посилається
цієї змінної і фактично не є змінною, щоб символ тут,
що це за символ на увазі?
Ну, це назва функціонувати тут
і обробник мабуть приймає два аргументи.
Чому два? Ну, якщо ви просто не читати ніяких документів
для цього конкретного модуля, ви буде сказано, що обробник
що буде викликатися буде Минуло менше двох аргументів,
посилання на запит,
і всередині запитом ми буквально означає HTTP запиту.
Таким чином, всі ті, HTTP заголовки що ви, можливо, пам'ятаєте
з початку семестр або деякі до класу
або досвід, як отримати лінію і приймаючу лінію
і User-Agent лінія, все, що инкапсулируется і більше всередині
цього об'єкта запиту.
І об'єкт відповіді є упорядковано для вихідних даних.
Так, у вас є посилання на заперечити, що відбувається, щоб дозволити вам
для передачі інформації назад браузер, викликаючи методи
на цьому останньому аргументі називається Res для відповіді.
Але це можна було б назвати Foo або бар, це всього лише конвенцій.
Так що тепер, що мені робити?
Ну, здається, що всередині цього супер простий веб-сервер
що я впевнений, реалізації, я збирається зробити наступне.
Я збираюся написати HTTP заголовок з кодом 200,
200 значення ОК, все добре.
А потім, я збираюся передати мабуть.
Що тип даних Другий аргумент правої головки?
>> Це об'єкт?
>> Це об'єкт з скільки ключі і значення?
Просто один з кожного, право, один ключ значення пари.
Так, "тип вмісту".
І єдина причина, Я цитую його тут
тому дефіс може бути об'єднані знака мінус
або щось в цьому роді.
Так, я повинен процитувати його тут, обпалити або подвійні лапки.
Але, знову ж загальна парадигма
в коді JavaScript часто одинарні лапки в ці дні,
товстої кишки і те значення.
Так, це тільки так званий тип розум.
Це заголовок HTTP що буквально відбувається
задовольнятися Тип дефіс товстої кишки Текст слеш ясно, що відбувається
бути відправлено з сервер в браузері
так що браузер знає чи буде працювати це як простий текст
або HTML або як зображення або кіно
або файл флеш-пам'яті або небудь ще.
Тепер, коли я насправді хочу відправити в тілі сторінки?
Ну, просто читаючи документація
для об'єкта відповіді всередині цієї бібліотеки.
Я бачу, що є правильний Метод і що приймає рядок,
можливо інші речі, але мінімально рядком.
І рядок це те, що виплюнути в браузер.
У цьому випадку його супер просто, його привіт світ,
але це може бути Opne Кронштейн, HTML, закриває дужка,
відкриває дужка голова, близько кронштейн і так далі,
це може бути сировина HTML.
Але ми тримаємо приклад просто, просто плювати
з найпростіших типів розуму який, можливо, текст / рівнина.
А потім response.end просто означає закрити з'єднання
і відправити все, що маю роду буферний всередині
цього об'єкта назад в браузер.
Я зробив. Добре.
Так, останнє, що Я роблю тут
і це дещо довільним і призначається, щоб бути прохолодно,
це я говорю офіціант нарешті слухати
на певному TCP портом за замовчуванням.
Нагадаємо, з початку класу, що послуги -
або ви, як правило, однозначно ідентифікувати його за номерами,
AD є веб, 443 HTTP основі сайти, 22 є SSH, 21 є FTP
і 1337 це просто довільне але це вище, ніж 1024
що означає на найбільш системи, я можу використовувати його
без необхідності супер права користувачів.
Так що це просто зручно.
Але 8080 знаходиться в офф - загальна один, 8088, насправді нічого великі
в тисячах, як загальна але це тільки більше еліта.
Гаразд, що відбувається коли я реально працювати в цьому?
Ну, я не просто відвідати сторінка в браузері.
Цей файл називається серверної 0.js.
Бо знову ж, Apache є Тепер з картини
на другу половину курсу.
Якщо я хочу Мережі сервер, мені потрібно написати
а потім запустити цей веб-сервер.
Але виявляється, що JavaScript як на стороні клієнта
і на стороні сервера є інтерпретована мова.
Таким чином, все що мені потрібно це перекладач.
Так it's - якщо наполягати, щоб запустити вузол, а потім сервера 0.js,
Я можу або, можливо, не бачив деякі виводитися залежно
про те, що бібліотеки я включив, нічого не здається, відбувається.
Але дозвольте мені перейти до браузер і відпустив мене
до того ж IP-адресою з моїх CS50 клієнтів.
Але це міг би просто а мій Mac
або мій комп'ютер, а потім натисніть Enter.
Це насправді виглядає Apache.
Це все одно що в каталог лістингу ми дивилися
в у першій половині.
Отже, що я зробив не так?
Так.
[Нерозбірливість Зауваження]
Точно, чи не так?
Так, Apache раніше слухати порт 80 за замовчуванням.
Навіть при тому, що я міг змінити це, Я міг вимкнути його всі разом
але він все ще працює.
Але ці хлопці можуть звичайно співіснувати.
Я просто повинні покласти товстої кишки 1337, а потім, може бути,
або, можливо, не коса риска в кінець відкрити порт
що це сервер працює на.
І тепер я бачу, що привіт, світ повернувся.
І я можу вдарити перезавантаження як стільки разів, скільки я хочу,
він як і раніше служить веб сторінку.
Дійсно, якщо я відкриваю в Chrome інспектор, перейдіть в мережі
а потім перезавантажити всю сторінку,
помітити, що насправді це було запит, який був відправлений.
Якщо я дивлюся на Raw джерела,
помітити мій браузер посилає всі ці речі.
І тоді відповідь від сервер був супер просто.
Існує 200.
Якщо це не занадто низько на екрані,
є тип контенту.
А потім node.js роду автоматично
для мене додав дату і всі інші речі
що браузери зазвичай очікують.
Так, давайте просто подивимося, трохи розсудливість перевірка.
Дозвольте мені повернутися до коду У серверному 0.js і нехай мене -
кожен раз, коли я йду в обробник,
дозвольте мені сказати, console.log.
('У нас був відвідувач!').
Мені не потрібно перекомпілювати або що-небудь подібне,
це інтерпретована мова.
Так що тепер, дозвольте мені повернутися до сторінка, перезавантажити один, два,
три рази і йдуть повернутися до моїм вікном.
А тепер я бачу це.
Ну от і дивно, Я бачу шість рядків.
Цікавий веб дрібниці, чому Я отримую шість запит не три?
Так?
[Нерозбірливість Зауваження]
Так. Так що, як ви знаєте трохи нерозумно значок у верхній
з адресному рядку, що багато
із сайтів, що використовуються мощі бути гребінь Гарвард,
це може бути логотип компанії або щось подібне.
Так, браузери в ці дні роду
з зухвалості зробити додатковий запит HTTP
майже кожен веб-сайт, що Ви відвідуєте перевірки, якщо є
за замовчуванням файлової називається favicon.ico
в тому ж каталозі, файл ви просили.
І якщо так, то це ставить значок там.
Так що все, що ми бачимо є саме це.
І справді, давайте подивимося, якщо ми можете переконатися в цьому, а не типу
з усього, "У нас був відвідувач".
Дозвольте мені йти вперед і вихід.
І я тільки знаю, що це від дивлячись на документацію.
Там у власності всередині об'єкт запиту називається URL
який, трапляється, шлях
що було запропоновано у фактичному URL.
Так що, якщо я перезавантажити сервер просто після перезапуску вузла
на сервері-0.js і Тепер же це один, два,
три і повернутися сюди.
Там це.
Слеш те, що я - людині з проханням
в favicon.ico є те, що браузер є
самовпевнено проханням.
Але справа не в стільки Favicon матеріал
але, як сервер працює.
Так?
>> Чому це має бути якийсь запит?
>> Чому це має відношення до - за своєю природою, як HTTP працює.
Так, HTTP може запросити тільки один файл за раз.
Браузери можуть бути розумним в ці дні
і тримати TCP підключення відкритим.
Якщо ви взяли CS143 або взагалі знайомі з роботою в мережі,
так що ви можете отримати виграш в ефективності
за допомогою мережі Гніздо відкритий
у прийнятті кілька HTTP запити послідовно над ним
але вони один файл згідно запиту.
Так що, якщо ви відвідуєте щось на кшталт -
Я маю на увазі, ми можемо перейти до більшість будь-яких сайтів.
Якщо ви йдете в - давайте підтягнути інспектор тут в Chrome.
Він може отримати заповнити найбільш сторінки.
Перейдіть на вкладку мережі і перейти до www.cnn.com.
І, коли ви відвідуєте cnn.com, його домашню сторінку -
ваш браузер, а звірячому робить - як і раніше вважаючи.
ОК. Принаймні, 289 HTTP запити знову і знову.
І саме тому, коли ви відвідуєте особливо роздуті веб-сайти,
вони повільно завантажуватися тому, що всі
активів вони завантажують.
Так, схоже, що 298.
Там можуть бути деякі Аякс відбувається в цей момент або деякі
активів тільки на низькому рівні.
Таким чином, кожен з яких є індивідуальний запит повертаючись
і вперед, взад і вперед.
І саме тому раніше, навіть хоча ми начебто говорили
про це кілька химерно де ви поклали тег сценарію,
абсолютно робить різниця, коли у вас є -
це почати є багато трафіку і багато
з файлів запитується.
І кожен з це являє ймовірно, образ, медіа-файл,
файл JavaScript, CSS файл і т.п..
Так, ми вже до деякі 4 мегабайта просто
подивитися на сьогоднішніх новин.
Хороше питання.
Добре.
Отже, що деякі з розквитатися хоча?
Право, ми знаємо, як зробити веб-сторінок вже з PHP.
І багато хто з вас прийшов, щоб клас знаючи Django
і Python або шини з Ruby.
Так чому ж ми повинні ще один мова та інфраструктура?
Що таке node.js особливо добре, якщо ви знаєте?
[Пауза]
Деякі речі?
Ні? Так?
>> Ретрансляція повідомлень.
>> Так, ретрансляції повідомлень.
Так що це правда, і це правда для більш технічних причин
і що node.js і дійсно JavaScript є особливо
добре підходить для асинхронного Код,
якщо при цьому ви створюєте ілюзія
робити кратне речі відразу.
Таким чином, навіть при тому, що вони насправді відбувається послідовно,
Дійсно, в більшості випадків, JavaScript і на стороні клієнта
і на стороні сервера є однопотоковий.
Які, якщо ви приймаєте 161 або навіть 61 означає, що -
даної програми відомо,
інтерпретатор може буквально зробити тільки одне відразу.
Але це не є великим для щось на зразок веб-сервер
де ви, можливо, десятки або сотні або, може бути, навіть тисячі
користувачів все намагаються отримати доступ до вашої веб-сторінки
в той же самий час.
І все ж, що запропонувати що обробка їм один
за другий після інші, особливо якщо деякі
з тих запитом як ми бачили на CNN може зажадати обслуговування
до 300 файлів, перш ніж навіть дістатися до наступного користувача
хто хоче бачити говорить новини.
Node.js краще підходить для середовищ, як, що.
Тому що те, що відбувається, будь повільний процес працює
як читання файлу з диска або запитів до бази даних або говорити
в деякому іншому мережевому сервері,
що, як правило, мають затримка, чи не так?
Якщо ви дійсно брали 61 або 161 особливо все такого роду
периферичних послуг як правило, набагато повільніше
ніж робити що-небудь всередині те ж саме ОЗУ і той же процесор
що говорити в цьому випадку сервер виконується.
Але те, що приємно про node.js є те, що ви можете -
і JavaScript в більш загальному є те, що ви можете зробити щось
а потім кажуть: "Хм, це буде
взяти мене кілька мілісекунд або навіть декілька секунд.
Дозвольте мені роду розщедритися, що від " але це не є істинним процес.
А потім, коли це робиться робити що повільний процес працює
як захоплення рядки з бази даних або читання файлу. HTML
з диска, він буде повернутися до мене, а
чим мене того, щоб чекати.
Таким чином, щоб зробити це більш ясно.
Це мої кошти роблячи це більш знайомим.
Гаразд, так що це Shake Shack на площі.
Це свого роду загальна парадигма
для пояснення асинхронність.
Насправді це добре приклад, тому що Shake Shack
і смачний гамбургер дивно уповільнити за те, що вони роблять.
Але справа в тому, що вони дійсно добре приймають замовлення
і беручи ваші гроші після які ви чекаєте своєї їжі.
Так, це насправді краще, дизайн, ніж альтернатива.
Тому що припустимо, що ви входите в магазин так, і ви отримали
в передній лінії, і ви розмістили своє замовлення, і ви хочете
щоб гамбургер, як можу скажіть, це займає не менше п'яти
або більше хвилин, щоб насправді отримати гамбургер.
Так, було б вид поганий бізнес-моделі
якщо поки ви чекаєте для вашого бургер, Еліс [передбачається написання]
і Боб [передбачається написання] і Чарлі [передбачається написання]
і всі інші черзі за вами
і ви буквально блокування лінія очікуванні їжі.
Так, очевидно, в Shake Shack
та інші фаст-фуд місця, не роби цього,
вони зробити щось на зразок цього.
Вони дають вам гудок.
І вони як би відправити вам на вашому шляху.
І вони називають вас по що робить ця маленька річ вібрувати
або флеш щоб привернути вашу увагу.
Таким чином, це буквально те, що?
Щось на зразок node.js робить.
Якщо node.js або JavaScript більш зазвичай використовується
і програміст досить розумний,
реалізувати, "Ви знаєте, що?
Все, що я потрібно зробити прямо тут може зайняти деякий кількість
мілісекунд або секунд.
Ви знаєте, що?
Дозвольте мені йти вперед, а не називають це синхронно -
», Тобто блокування хлопець всі інші в лінії ", -
дозвольте мені йти вперед і роду крок у бік
і просто назвати себе назад
коли так довго працює операція завершена ".
І передзвонити звичайно натякає в даному випадку
на функцію зворотного виклику, Посилання на патроні коду
, Які будуть отримувати виконаний коли ваш гамбургер готовий,
так само, як це справа є деякі вид функціональності вбудовано-
що воно починає вібрувати або гуде, коли прийшов час для вас
бути відкликаний до передня частина лінії.
Отже, що робить це означає в реальному вираженні?
Ну, ми повинні працювати наш шлях.
Отже, дозвольте мені йти вперед і зробити це в першу чергу.
У серверному 1.js, нехай мені Перший спростити код
так що ми можемо зробити кроки дитини до переконливішим проблема.
Це точно такий же Програма, яку я написав раніше.
Але те, що було змінено?
Там начебто невелике синтаксичний різниця
між цим і версія 0 мить тому.
Що впадає в очі Ви, якщо ви пам'ятаєте?
Так Синтія [передбачається написання]?
[Нерозбірливість Зауваження]
Так. Так що тепер, у нас є лінія з функції передається дюйма
Ми позбулися подібного
з марно імені Функція обробника.
Даремний тільки в тому, що, перш ніж навіть називаючи його в одному місці,
Я дійсно не потрібно витрачати час даючи йому ім'я
і що робить його важче читати код зверху вниз.
Отже, давайте просто оголосити інлайн є анонімною функцією.
І я роблю два інші речі.
Я роблю краще використання точкової нотації.
Так як в JQuery, багато вузла методи можуть бути з'єднані один з одним.
Так що, як тільки ви закінчите виклику щось, вам не доведеться
чекати на новий рядок і виклику іншого методу,
ви можете просто ланцюг їх разом.
І так в цьому випадку, ми можемо дійсно затягнути це.
Так от, це в буквальному сенсі веб-сервер в п'яти ліній
від загального числа коду на відміну від -
на відміну, що ви можете нормально потрібно зробити, щоб створити щось.
Якщо я йду в сервері 2 зараз, давайте зробимо це.
У сервері 2 - фактично давай повернутися до цього сервера 2.
Давайте тепер відкривають асинхронний-0.js і вирішення цієї проблеми під рукою.
Отже, спочатку давайте вперед і відкритим
до асинхронних-0.js в браузері.
Так асинхр-0, відпусти мене назад в браузер.
Хітів перезавантаження.
І тепер, це свого роду повідомлення про помилку.
Дійсно я бачу 500 в інспекторові Chrome.
Але дозвольте мені більш точно запросити hello.txt.
ОК. Таким чином, це, здається, працює.
Так асинхр-0.js, здається, не обслуговувати до щось для косою риси.
Це не має підтримки файлу за замовчуванням.
Але якщо я явно запросити hello.txt,
що, здається, підтримки.
Чому це відбувається?
Ну, те, що я пішов сюди
і зроблено реалізується супер простий веб-сервер
що показує, де асинхронність може бути корисно.
І це реалізується таким чином.
По-перше, я використовую Модуль HTTP знову,
але і FS, які ймовірно, означає?
В цілому в CS, файлової системи.
ОК файлова система.
Тому далі FS, файлова система.
Гаразд, так що що це дає мені?
Функціональність, пов'язані з файли, такі як отримання пройшло,
відкриття файлів, написання каталоги, читання каталогів
і все в такому ж роді.
Так що тепер помітити, цей код такий же, як і раніше,
створити сервер, проходячи в анонімній функції.
Це свого роду довільним.
Це не дуже безпечний веб-сервер.
Насправді, ви могли отримати доступ Найбільш будь-який файл на жорсткому диску
або на сервера важко їзди на виконання цього коду
тому що я просто сліпо за умови, що я збираюся
захопити все, що користувач просив в URL.
І я збираюся префікс з точкою
так що я незначно бути безпечним
, Сказавши, що файл вони можуть запит має принаймні почати
в поточному каталозі.
Звичайно ж, є загроза тут.
Бо якщо вони замість включають що?
У своєму шляху, вони можуть частково з обійти цей теж.
Dot, точка, чи не так?
Так, якщо користувач просто поставити крапку, точка в URL, в теорії,
вони могли почати отримувати мій - і сказати файл паролів.
Таким чином, це не означало, бути забезпечено,
це призначається, щоб бути просто.
Так от, у мене є змінна, яка є конкатенація точкою
який присутній каталог і URL запиту
які ми бачили раніше є як скоротити або / hello.txt.
Так що тепер, це стає трохи цікавіше.
По-перше, зверніть увагу на дно.
Я слухаю на той же порт, як і раніше.
Таким чином, реальний цікаво робота всередині тут.
Кожен раз, коли запит приходить в за своєю природою
цього коду, що я роблю?
Я дзвоню файл Метод читання файл системи,
проходження по шляху що я хочу прочитати.
І тепер, це що цікаво тут,
це з реалізації в асинхронного методу.
Ви не можете отримати віддачу значення з файлу читання.
Насправді повідомлення, є вираження не ліва
зліва від файлу зчитування.
Він не повертає значення.
Швидше, він викликає функцію зворотного виклику функціонувати, коли він готовий
щоб дати вам назад відповідь.
Отже, ще раз, щоб було ясно, тоді як в минулих,
в багатьох програмування мови, якщо ви хочете
читати матеріали справи в точці PHP,
файл підкреслення отримати підкреслюють зміст,
у вас є вираз ліву по всій вартості після -
до знаку рівності, це означає, що ви привласнюєте
цієї змінної повернення Значення цієї функції.
Ви можете зробити це в node.js, але ви, як правило, мають
подзвонити явно синхронний версії функцій подобається,
Я думаю, це читати синхронізації файлу або синхронізації прочитати файл.
Я забув, як вони назвали його.
І, що б дати Ви що повертається.
Але якщо цей файл на деякі віддаленої файлової системи
або диск просто природно повільно, це може зайняти 10 мілісекунд
або 2 секунди протягом цього файлу насправді повернутися.
не те ж, ніякої іншої веб- відвідувачі обслуговуються
на Ваш Сторінка.
Ти блокування.
Це те, що називається блокуючи IO, вхід / вихід.
Так от, це набагато розумніше.
Тому що те, що node.js збирається
робити з інтерпретації полягає в наступному,
він збирається подзвонити метод читання файлу,
спробувати одного до файлу, який отримав Шлях, вказаний на значення П.
І потім, якщо і коли це буде готово щоб дати вам назад вміст
файлової P, він викликатиме функція чий підпис стоїть
за угодою наступне.
Два аргументи, перший з якого, може бути об'єктом Помилка,
капітал Е, це об'єкт називається помилку або Null
якщо немає такої помилки.
І другий аргумент - прийняти здогадка - буде що?
Вона називається дані, очевидно, але що дані більш конкретно?
>> Зміст?
>> Зміст hello.txt у прикладі я витягнув
в моєму браузері хвилину тому.
Отже, іншими словами, щоб прочитати файл і багато node.js функції
як на не повертають значень.
Вони називають зворотні виклики і передавати
тим зворотних викликів, що б були традиційно
повертати значення.
Позитивна сторона такого підходу є
що ви могли б назвати читати файлу T0.
Функція зворотного виклику міць не назвати один тик пізніше
так сказати при Т, це можна було б назвати T1000,
тис. кліщів пізніше.
Але справа в тому, що Інша частина коду в цьому файлі,
якщо такі б відразу бути виконані в той час як node.js
і в той час як файлова система з'ясовує, як читати
що файл і отримати його назад до вас.
Отже, ви створюєте цей -
так ефективно ілюзія
паралелізму, дозволяючи повільніше запущених процесів не
блокувати важливі речі, та частина, яка обслуговування користувачів.
Отже, як ми впоратися з цим?
Це дуже поширена node.js парадигма.
І є шлях тільки для спрощення це ми побачимо перед собою.
Я спочатку зареєструвався, якщо Помилка не є нульовим.
Так що, якщо це не брехня Потім сталася помилка.
Я не знаю, що це таке, можливо файл не існує.
У мене не було дозволу.
Ім'я шляху не так.
Будь-яка кількість речей може піти не так.
На даний момент, я збираюся довільно повернутися 500
що внутрішня помилка сервера.
Щось пішло не так.
Я дійсно не дбаю діагностувати його.
Отже, давайте просто сказати користувач вона не працює.
А потім, я збираюся зробити res.end,
і це скорочене позначення.
Нагадаємо, що минулого раз я зробив res.write
а потім я зробив res.end.
Якщо ви хочете тільки відправити один рядок,
ви можете просто зробити все відразу з res.end з аргументом,
і що збирається відправити що повідомлення про помилку
всередині цього об'єкта в браузер.
Це було досить дуги Нагадаємо, якийсь час назад.
Я поняття не маю, що це означало на перший погляд.
Але, коли я просив файл, який не існує -
ой, нам потрібно запустити сервер знову.
Коли я просив файл що не існувало, EISDIR,
так щось про причому каталог,
якщо я роблю деякі випадкові рядок є,
мабуть, це означає, що файл навіть не існує.
І це тому, що мій код просто говорить, щоб написати
з вся сировина Повідомлення про помилку є,
так не дуже зручною для користувачів але принаймні я з нею.
В іншому випадку, якщо це не було помилка, що я роблю?
Те ж саме, як і колись косі з 200 OK, простий -
Текст / рівнина Тип розум і потім виплюнути дані.
І саме тому я отримую Зміст hello.txt який тільки
щоб підтвердити, якщо я подивився в hello.txt,
це буквально тільки Здрастуй, світ.
І якщо я змінив це привіт, світ, збережіть файл,
перезапустити сервер, перезавантажте сторінку.
Тепер, я отримую цю версію.
Так, у мене насправді просто перевизначений веб-сервер
як існував для багатьох років, але з використанням node.js.
Але ми можемо зробити це навіть більш акуратно.
Дозвольте мені відкрити асинхронний-1.js.
Тепер, зверніть увагу, я додаю другий модуль на цей раз,
мабуть, модуль шлях.
Тепер, це хороший можливість подивитися
на те, що документація виглядає.
Node.js є документація.
Як PHP, я думаю, насправді дуже добре
і прямо вперед.
Якщо я йду в node.js і Google і пошук Node.js шляху,
що ви побачите, як правило, прямий зв'язок з URL
що я ставлю тут кілька хвилин тому.
Так / API є офіційним місцем піти на документації.
І те, що ви побачите у верхній
офіційній документації вузла це всі методи і
або властивості всередині саме цей модуль,
один з яких називається приєднатися.
І приєднатися є допоміжна функція що відбувається, щоб дозволити мені
щоб не возитися з всі плюси.
І це має додаткове бонус, як ви побачите,
з доків це також нормалізує отриманий шлях.
Так, якщо користувач або у вас є точки або точок точка або будь-якої комбінації
з тих видів відносна доріжки, серед розквитатися
з об'єднаної методу полягає в тому він збирається очистити всі, що до
і дати вам канонічної Шлях без будь-яких
з тих точок або точок точок.
Таким чином, це хороша річ в Взагалі для безпеки, принаймні
якщо ви перевіряєте повернутися значення, яке я не
в даному простому випадку.
Але я хочу використовувати його.
Так що, я тепер створити шлях до файлу трохи більше програмно
з path.join замість з Raw об'єднання.
Так, що це трохи чистіше, ніж раніше.
А тепер зверніть увагу, що я, будучи трохи розумніші, а
ніж просто сліпо спробувати прочитати файл,
Я збираюся насправді подзвонити fs.stat.
Так що, якщо ви знайомі
з низьким рівнем C функції і С, навіть PHP.
Багато бібліотек мають ця функція стат повертається
по суті статистика на файлі, розмір файлу,
дозволів, назва і тому подібні речі,
а також неявно, якщо файл існує чи ні,
а якщо файл або каталог
або символічна посилання або щось ще.
Так що тепер помітити, що я називаючи fs.stat.
А потім, мабуть, відповідно в документації,
Мені потрібно повернутися в об'єкті Error
або Null з подальшим об'єктом статистики.
Але давайте перевіримо це, node.js.fs.
Ось файл система документації.
Дозвольте мені шукати статистику.
Там дуже багато більше функцій тут.
На жаль, що стат синхронізації, fs.stat.
Так от, це асинхронний Статистика (2).
Це якщо ви це означає, пам'ятаєте з основних сторінок,
глава 2 головної сторінки,
що означає, що це буквально просто реалізація вузол
з низького рівня Системна функція стат.
Так, функція зворотного виклику отримує два аргументи, помилки і стат
де стат об'єкт fs.Stats.
Отже, давайте подивимося, що цей об'єкт Передбачається виглядати.
Давайте клацніть гіперпосилання і я бачу, що.
Об'єкт статистика містить мабуть, деякі допоміжний метод,
є файл, є каталог, є купа інших речей.
Це "є" файл, що я дбаю про в даному конкретному випадку.
Так от, я йду.
Якщо сталася помилка, то дозвольте мені врятувати цей раз
і припустимо.
Якщо є помилка, це було ймовірно, файл 404 не найден.
Це може бути щось інше
але я, будучи трохи ледачий тут тільки зосередитися
на більш цікавих деталей.
Але для користувача мети, файл не знайдено,
чи не було помилки заявивши файл.
В іншому випадку, дозвольте мені перевірити, якщо файл дійсно сам файл.
Так що, якщо це не файл, вона існує.
Там-то там, але це, ймовірно, каталог
або, може бути символічною посиланням
або щось ще, що це фанки у файловій системі.
У кожному разі, користувач не повинні бачити це.
Так що тепер, я просто хочу, щоб плюнути
з умовно несанкціоноване 403.
Але, знову ж просто угода,
Я міг би використовувати щось ще в теорії.
А потім, нарешті, дозвольте мені спробувати прочитати файл.
Отже, дозвольте мені перейдіть вниз.
А тепер зверніть увагу це, де код може отримати трохи брудний,
помітити, що я дзвоню fs.readFile проходження
по тому ж шляху, те ж саме зворотного виклику, як минулого разу,
так що попередня версія.
І потім, якщо я знайду -
якщо я не знайти його, Я виплюнув з 500.
А якщо я його знайти, те, що Лінія ми збираємося тут бачимо?
Ми збираємося, щоб побачити фс написати заголовок 200, ймовірно,
і res.end відправки фактичні дані.
Але помітити це.
І це не демонстративне з гіршому випадку.
Але у мене є цей стат виклик тут, ніж у мене є деякі речі.
Тоді, у мене є інший асинхронний виклик тут,
так ще відступи.
Так, тільки частково екстраполювати якби ви могли звідси.
Яка проблема, як правило, виникають у зв'язку з мова як JavaScript
в цьому середовищі, де у вас немає повертаються значень
а у вас є ці зворотні виклики.
І, звичайно, це всього лише стилістичний річ той факт,
що я продовжую відступи.
Але прийняти це наступним логічним кроком.
Припустимо, що були один або два або три інші функції
що я повинен був виконати, що були за своєю природою асинхронний,
і тому ви тільки частково тримати відступів впоратися з ними,
поводитися з ними, щоб впоратися з ними.
Ви отримуєте роду зворотного виклику чорт візьми, як люди називають це
де починається ваш код щоб отримати дуже широкий
і відверто дійсно важко читати.
Як це, я можу роду ледь сказати, що це свого роду потік
що має такого роду
стилістично кутовий річ тут відбувається.
Таким чином, це не ідеально, тому що це може дуже швидко стати
громіздким, хоча два асинхронний не називає
таку велику справу.
Таким чином, ми могли уникнути цього, чи не так?
Ви, можливо, побачив, що Я misclicked хвилину тому.
У документації, ви знаєте, це схоже, що є statSync.
І statSync не приймає зворотного виклику в якості аргументу.
Це займе всього шлях, тому що він, очевидно, що робить?
Це повертає екземпляр з fs.Stats.
Так що це може бути вашим перший інстинкт, чи не так?
Особливо, якщо функції зворотного виклику
і асинхронність є трохи нової для вас, чесно кажучи,
найпростіший підхід, ймовірно, просто уникнути цієї проблеми все
разом, повернутися, щоб розібратися програмування CS101 стилі
де ви викликати функцію або метод повертає значення,
подзвонити функція, повертає значення,
функція повертає значення.
І я міг би використовувати тому fs.statSync
який буквально те ж саме але це синхронна версія
що означає, що повертає значення.
Це не проходить цінуємо на зворотний виклик.
Але чому б, ймовірно, буде субоптимальний обхідний шлях вдатися
в синхронних функцій?
Так?
[Нерозбірливість Зауваження]
Точно, це займає багато часу.
Ти просто уповільнення все вниз.
Тому що так само, як Shake Shack або смачний гамбургер, якби вони позбулися
з тих зумери і зробили вас, клієнт стояти на фронті
лінії, поки ваша їжа не буде готова ще до того, приймаючи замовлення
про людину, за ви, очевидно,
через оферті сповільнюється.
Люди починають залишати, ви як би залучити пакети.
Ви можете зробити будь-яку кількість аналогій тут.
Але загалом, це ймовірно, не дуже хороша річ
для бізнесу або для сервера.
Так асинхронний код звичайно добре принаймні,
в цьому випадку, але він безумовно починає викликати деякий тугу.
І насправді я насмілюся сказати, коли Перший писати цей матеріал,
це займе трохи трохи звикнути.
Так, давайте почнемо обладнати Ви з деякими бібліотеками
і методи, щоб зробити це трохи легше.
Так, один з найбільш поширених бібліотеки популярні бібліотеки
в ці дні, це одна називається async.js.
І як багато node.js бібліотеки або модулі,
це все з відкритим вихідним кодом.
Вони майже всі живуть і отримати репозиторії хаб, який є свого роду
зі сталі де-факто місце для зберігання цих речей.
А тут ще Вся інфраструктура
для установки ці речі називається НПМ, вузол Package Manager
який, якщо ви знайомі з EvanTube добрий
з, як додаток або програми отримати.
Якщо ви знайомі з Red Hat і Fedora
На пристрої це як цукерка.
Але це вузол - це Менеджер пакетів просто
для цієї конкретної середовища.
Таким чином, можна завантажити та встановити речі, як бібліотеки асинхронного
а також ще один називається підкреслюють бібліотеки або модуля.
Але ці Наскільки фс, HTTP, шлях,
ті всі приходять вбудований у вузол.
Так що, якщо ми йдемо в документації API, ви дійсно будете бачити, що побудований
у вузлі ви отримуєте безкоштовно ціла купа модулів.
Але багато хороших людей на Інтернет зробили десятки
якщо не сотні інші бібліотеки
робити речі краще, або по-іншому.
Отже, давайте поглянемо на як працює ця бібліотека.
Так, більшість з цього коду ідентичні на даний момент.
У мене є шляхи, за яким створено нагорі.
А тепер я дзвоню async.series.
Таким чином, бібліотека асинхронний, це просто бібліотека, яка дозволяє вам
пройти або підняти зазвичай з функції, щоб звані один
за іншим просто виду уникнути цього питання відступу,
і насправді просто ментальна туга, що неминуче виникають
принаймні, коли ви вперше зануритися в це на свій власний
з програмуванням асинхронно.
Як і в сторону, якщо ви взяли 161, і ви мали справу з замками
і підняти умови і все цього, асинхронного коду
і навколишнього середовища, як node.js насправді багато,
набагато простіше, можливо
чим насправді писати багатопотоковий код.
У будь-який час у вас є багатопотоковий код,
у вас є умови підняти.
Ви повинні турбуватися про два потоки, що містять
за ті ж ресурси диск або пам'ять.
Краса JavaScript
в node.js є є буквально тільки один потік,
що означає, що браузер
або сервер може тільки зробити одну річ за один раз.
Це просто залежить від вас, програміст
зберегти ментальну модель для як ви роду черзі речі
і з'ясувати, як замовити свій код.
Але ви ніколи не доведеться турбуватися про підняти умови
в абсолютно так само, в мірі з Raw коду, як це.
Таким чином, це трохи важко grack тут.
Але - Отже, дозвольте мені відкрити Документів на мить.
Async.js бібліотека, яка Аналогічно дуже googleable,
вона живе в GitHub пересаджувати, як багато з них.
Не думаю, що це уривчасті, це не так.
Дозвольте мені перейдіть вниз до Read Me тут.
Так, бібліотека асинхронних надає цілий букет
методів всередині нього.
Наприклад, є метод, званий друг,
який, якщо я натискаю це тільки щоб побачити свої документи на мить,
це функція або метод що дозволяє зробити щось
як чотири кожного але паралельно.
Вони все станеться потенційно паралельно.
А метод друг тільки збирається повертатися до вас, коли всі
з ітерації завершені.
Тому, можливо, вони відбуваються один за іншим.
В ідеалі, вони відбуваються по суті паралельно.
Але метод не вам передзвонити.
Це не оманливих НЕ зумер, поки всі
з елементів у вас є ітерації завершили.
Таким чином, це просто хороший спосіб
уникнути за допомогою простий чотири петлі
але насправді робити щось асинхронно.
Але тепер більш безпосередньо пов'язані з цим, наприклад,
помітите, що це таке Метод рядів.
І дозвольте мені просто підтягти просто канонічний приклад.
Таким чином, асинхронні бібліотеки, серія Метод приймає як припущених
квадратними дужками в масиві.
Які дані Типи елементів
в цьому масиві основі на простому прикладі?
Це масив функцій.
Таким чином, в C, ви могли б назвати їм функціонувати покажчики.
У JavaScript є більш правильно посилається на функції
або анонімні функції.
І це просто означає, масиви
звичайно впорядковані від нуля і вище.
Таким чином, вони зберегли Порядок і це добре
за серію, бо серія , Звичайно, означає зробити щось
щоб не паралельно.
Таким чином, це означає лише те, що це функція буде отримати виконаний,
то це одне, то це один, цього разу, то це одне,
Однак багато є
поки, нарешті додатково зворотного виклику викликається.
Так, зверніть увагу на парадигму тут.
І хоча це є бібліотека одна хлопця,
це представник дуже поширені JavaScript парадигма
з ще раз, використовуючи зворотні виклики.
Так, зверніть увагу, що ви робите тут.
У першій функції, що є прийнятий в через цей масив,
Ви визначили анонімний Функція просто з функцією.
Але зверніть увагу, що мабуть, відповідно до цієї документацією,
що анонімна функція повинна приймати аргумент зворотного дзвінка.
Це збирається бути дороговказом або посилання на функцію
що вам слід звернутися, коли ваш Код готовий повертати значення.
Отже, ще раз, на відміну від просто зазвичай процедурного програмування
де ви звикли до повернення значень відразу
що одна різниця з з використанням бібліотеки, як це
в асинхронного програмування більш зазвичай, коли ви будете готові
для повернення значення з база даних, з файлу,
від арифметики вираз, це до вас,
викликати функцію зворотного виклику.
І хороша річ про цій бібліотеці
якщо ми читати документи більш ретельно, що,
тоді і тільки тоді все площа зворотні виклики називається
без об'єкта Error, буде все це вдасться?
Отже, іншими словами, якщо є 2,
якщо є 10 анонімно функції
в цьому масиві тому в цій серії,
тільки якщо всі вони домогтися успіху,
відбудеться фінал необов'язкову функцію вважати успішним?
Якщо хтось із них не вдається, кожна функція
після того, що не буде навіть бути виконана.
Таким чином, це хороший спосіб сортування наявності ланцюжок
що перериває передчасно якщо щось піде не так.
Таким чином, щоб побачити це в контексті, тут то, як ми могли б повторно реалізувати
що попередня програма.
Я отримую шлях як і колись, так що це легка частина.
Я скопіювати і вставити цей скелет код
з документації там async.series відкриває дужка,
відкрити квадратну дужку.
А тепер зверніть увагу у мене є один функція в цьому початку
секунди, ми побачимо куди ми йдемо від цього.
А тепер зверніть увагу, що це трохи складним на перший
але зосередитися тільки на построчно.
Fs.stat означає отримати статистику або те, що не цього шляху.
Назвіть цей зворотний виклик, коли будете готові.
Цей код є таким же, як раніше.
Якщо є помилка, є одна різниця тепер.
Знову ж, дуже поширені парадигма в Node.js програмування
якщо щось піде не так і зворотного виклику повинен знати
що за угодою, перший аргумент зворотного виклику буде
бути ні, якщо все добре чи посилання на об'єкт Error,
капітал Е. Це як Помилка клас, який існує в усьому світі
але про це іншим разом.
Так, роблячи це, якщо є помилку, в чому ж сенс?
Ну на основі того, що я сказав серії робить,
є, якщо щось піде не так, ми просто як би хочу
перервати цілу серію закликає з анонімна функція.
Так, досить для мене, щоб просто повернути проходження зворотного виклику
в об'єкті Error.
Тому що, якщо стат дав мене назад про помилку,
Я міг би створити новий Об'єкт Помилка самостійно,
але я дійсно не дбаю, щоб,
Я просто хочу, щоб пройти всі Помилка в тому, що насправді сталося
так що я можу передати його в цьому зворотному.
І так само, щоб було ясно, повернення не є строго обов'язковим.
Я по суті хочете це зробити але я хотів зараз робити "повернутися;
/ / Так, щоб не більше Код тут виконує ".
Отже, ще раз одна поширена Конвенція в JavaScript,
навіть якщо ви не повернення значення по собі,
Ви хочете передати значення у функцію зворотного виклику
але тоді ви хочете , Щоб зупинити виконання
функції ви перебуваєте в, в тривіальним чином
зробити це тільки подзвонити повернутися сюди.
Але немає нічого поганого,
Ми просто робимо зворотний зворотний виклик Помилка хоча це буде
повернутися в невизначене значення.
Гаразд, це не повертати значення, швидше за все.
Все, що я дбаю про те посадкою подальшого виконання.
Отже, мій сплав з них дві лінії просто стиліст
до конвенції тільки Тобто кількість лінії
коду я тільки що написав від 2 до 1.
Так що ж ще?
Якщо є не помилка -
насправді, щоб бути ясно, Я міг би також уникнути
, Що, роблячи, якщо в іншому місці.
Але, знову ж, ще один загальна парадигма перевірка
для ваших помилок нагорі, а потім просто повернути, а не продовжувати
зробити відступ код з Elses і Elses і Elses.
Так що, якщо це не файл, зараз, ви знаєте,
Я хочу впоратися з цим трохи спеціально.
Так от, як в Java або C + + або кілька інших мов,
от як створити екземпляр заперечувати проти введіть проходження помилку
в повідомлення за замовчуванням з не файл
і це тільки кілька довільно.
Але я сигналізації помилка моя власна.
І те, що робить це в минулому лінія імовірно означає?
Все добре.
Якщо ви передаєте в нуль для Параметр помилку, що просто означає,
за угодою все добре.
Так, що означає те, що відбудеться логічно?
Якщо нуль передається у функцію зворотного виклику
це означає, що цей анонімний Функція вдалося
так сказати.
Отже, що ж слід серія Метод передує і тепер робити, грунтуючись
на моєму словесним визначенням раніше?
[Нерозбірливість Зауваження]
Переходьте до наступного, чи не так?
Якби повернувся ненульовий значення, було б просто перервати
і не більше анонімно Функція буде викликатися.
Але оскільки це не так, то це буде викликаний наступний.
Таким чином, логіка в тут в значній мірі те ж саме, як і раніше
і ми побачимо, як очистити це до далі в мить.
Я розумію, що це свого роду великим
ввібрати в себе всі усно і візуально.
Але тепер помітити, другий анонімна функція, що я хочу
виконати в серії щоб спробувати прочитати файл.
Назвіть цей зворотний виклик коли ви будете готові.
Якщо є помилка, просто сигналізувати його шляхом зворотного виклику
так що інша частина цей матеріал перериває.
Останнє повернення нульовий.
Але чому я проходячи в двох аргументів?
Ну на цей раз, якщо я читаю файл і повернутися
як змінна з ім'ям даних,
Я хочу не тільки означає все добре, повертаючи нуль
для першого аргументу.
Я хочу повернутися фактична Дані в якості другого аргументу.
Бо якщо я читати далі в документації,
помітити цей останній шматок коду квадратна дужка означає, що це
кінець ряду.
Були тільки два анонімно функції в цій серії.
Якщо сталася помилка тут, то Я знаю, що одна з ланок
в цьому ланцюзі, так говорити не вдалося.
Отже, іншими словами, ця помилка буде об'єктом Помилка
тобто порожнім, якщо все з цих хлопців не вдалося.
І якщо це так, я просто збирається виручити, і я збираюся
сказати 400, який означає запит не вийде,
це дуже загальний повідомлення про помилку.
І потім, я збираюся роздрукувати повідомлення про помилку.
Так от, я не потрудившись супер анал на цей раз,
Я не збираюся розрізняти між 500 і 404 і 403,
Я тільки частково сліпо махаю рукою
і сказати щось пішло не так.
Але якщо нічого не зробив піти не так,
Я збираюся відправити це res.end проходження цього дані.
Тепер це виглядає трохи загадково.
Але знову ж, якщо я читаю документація,
Другий аргумент цей останній, остаточний зворотного виклику,
хлопець, який виконується тільки після того, як серія робиться
виконання або частину є з, це буде масив
всього другого аргументів
що були прийняті у функцію.
Тепер, виходить, що посилаються тільки в цій серії
що насправді повернутися до другого Аргумент цей тут.
Так що я збираюся до виду на стрибок віри просто використовувати, нехай
на даний момент, що останній є методом
що дає останнім елементи масиву.
Оскільки цей масив який передається
мені є дві світові індекси, нулем і одиницею.
Це просто нуля не має значення тому що цей хлопець повертається -
не проходить в секунду аргумент, але цей хлопець робить.
Так призводить кронштейн нулю нічого,
Результати кронштейн один містить те, що,
якщо ви стежили за разом до цього моменту?
Файл, привіт, світ контент мабуть,
так от як я насправді роздрукувати його.
І дозвольте мені закінчити одна деталь тут.
Якби я робити такого роду старий школа, якщо я хочу отримати
на останніх елементів, якби я міг зробити результати [results.length-1],
це ніби стара школа способом
для отримання останнього елементи в - або нульовою індекс масиву.
Але, як і в сторону, нагадаємо що я повинен був цю бібліотеку
тут підкреслення, які по Конвенція так і називається
буквально підкреслення характер, який не є особливим,
це виглядає просто здорово, як знак долара робить для JQuery.
Це всього лише помічник Метод підкреслюють точку останнього
що робить саме те ж саме.
І якщо ви ніколи не використовували його перед підкреслюють JS як
для клієнтської сторони кодування
і на стороні сервера є дивно корисні бібліотека
що так багато людей, описані це подобається JQuery містить всі
з методів, люди хотіли прийшов з самого JavaScript.
ОК.
>> Так, як в значній до мене і Я дивився в серії,
у вас є, як зворотний виклик як аргумент?
>> Так.
>> Як і коли ви насправді, як поштовх, який в,
і як те, що робить це на увазі, коли ви просто повинні
як зворотний виклик, а потім зробити як -
[Нерозбірливість Зауваження]
>> ОК, гарне питання.
Отже, дозвольте мені підтягнути асинхронний головну сторінку тут
або документація по GetHub.
Так що це канонічна Структура.
Якщо ви виклик за допомогою цього Зокрема Метод рядів,
є дві великі частини до нього.
Одним з них є масив анонімні функції
і два є остаточним зворотного виклику функція, яка насправді
виконується, по крайней кінець ряду.
Тепер, якщо ми збільшення трохи ближче на перший
з тих великих речей, масив анонімних функцій
на вимогу цього документація хлопець має
бути анонімним функція, яка приймає
в одному аргументу називається зворотним викликом або Foo або бар, це не має значення
але він дзвонить його зворотного виклику.
І це свого роду вашої зумер що Shake Shack вручає вам.
Це засіб, за допомогою яких Ви можете повернути значення
замовнику, тому що вам може не просто буквально повернутися.
Ви повинні зробити це спосіб цього зворотного виклику.
Тому що, якщо всередині цього функція деякі повільний біг
Код, як бази даних запиту, читати файл з файлової системи,
Ви не хочете чекати там і блокувати всі інші,
Ви хочете назвати зворотний виклик.
Так от, це в буквальному сенсі ім'я аргументу.
Але так, як в C, ви є покажчики на функції.
У Java у вас є еталонні методи системи
і те ж саме тут, в JavaScript.
Це є змінною, але його тип функції.
Так просто, написавши своє ім'я Чи зворотний дзвінок або Foo
або бар, то відкриває дужка і закриває дужка,
, Необхідно виконати, що на цій функції.
І, проходячи нуль якої означає нульовий помилка, і одне
що означає, що це Дані, які я хочу передати дюйма
І тоді шматок, щоб було ясно, це ще один зворотний виклик.
І це не називається зворотного виклику,
він просто концептуально є Функція метод зворотного виклику
тому що це називається за визначенням
бібліотеки цього автора, коли вся серія завершила
або підмножина його, якщо Помилка сталася раніше.
Так, ім'я функції зворотного виклику, виклику функції зворотного виклику,
Ім'я функції зворотного виклику, виклику функції зворотного виклику,
відрізняється зворотного виклику функціонувати всі разом.
>> Тепер у нас є як визначити зворотний виклик?
>> Ні, тому що цей хлопець пройде в масиві
з анонімні функції,
покажчик на код він хоче виконати.
Точно, все в порядку.
Тому, будь ласка, сказати, що Код стає трохи простіше.
Так, він може.
І якщо ви схожі на мене, прийняти комфорт, принаймні, знаючи,
це вимагає часу, щоб звикнути до цього.
Але ми можемо очистити це до трохи,
не кидати занадто багато для вас але ось ще одна варіація
і його іншим способом
в тій же бібліотеці називається водоспад.
Верх з яких є на відміну від серії, де кожен
з тих, анонімно функції виконуються по суті
незалежно від кожен з інших.
Водоспад, як випливає з назви дозволяє самій верхній ФУНКЦІЇ
щоб частково пройти в значеннях до нижньої функції
ніби як каскад води.
Таким чином, потенціал зростання цього є те, що я можу роду
від того, використовуєте це на мою користь.
У async.waterfall, зверніть увагу на наступне.
Я можу просто зателефонувати fs.stat проходження по шляху
що я хочу, щоб отримати статистика по.
А потім пам'ятати, перш ніж я було анонімну функцію
що було два аргументи помилятися,
esults а потім я подзвонив в функція зворотного виклику вручну?
Іншими словами, це просто бути ясно, нагадаємо, що раніше
в асинхронн 2, я зробив усе, з цієї неприємної роботи.
Я подзвонив fs.stat пройшло в Р,
заявив мій власний анонімний функція.
Я тоді перевірив, якщо помилка не нульовий, тоді я зробив це,
ще я зробив це, вся Краса наступних конвенцій
як в node.js в тому, що зворотного виклику функції в цілому призначені
взяти хоча б один аргумент, Об'єкт Помилка подальшим нуля
або більше корисні значення.
Так помітити парадигму тут,
ця функція зворотного виклику Я оголосивши слід точно
парадигма, яка цей хлопець Бібліотека асинхронного робить.
Що говорити про це, чому ж Я реалізації свій власний зворотний виклик
метод, коли автор цього Бібліотека буквально простягаючи мені
на блюді так сказати, функція зворотного виклику можна використовувати?
Так, я можу просто передати в посилатися він дав мені
так що відразу, мої кілька рядків
коду стати одного рядка коду.
Тепер, куди ми йдемо з цим?
Наступна функція, яка Я хочу, щоб виконати,
на наступний анонімний Функція в цьому масиві
функцій робить наступне.
Повідомлення перший стат перший аргумент.
Таким чином, дещо змінилося вже.
Тепер, це хлопець, який написав бібліотеку -
і я кажу хлопцеві тому що це хлопець.
Це хлопець, який написав цю бібліотеку є документація гарантії
що якщо ця функція тут проходить мене назад об'єкт Error
або нуль з наступним комі список розділених інших цінностей,
він буде переконатися, що ті, інші значення руками
до цього анонімної функції в порядку зліва направо.
І те, що раніше було просто функція зворотного виклику поодинці просто
стає останнім такий довід.
Тепер, я не знаю, хто я зосередити всі сили на ви знаєте.
Але тепер, у чому відняти тут?
Так, ми знаємо з документація
або до декілька прикладів
що fs.stat в кінцевому рахунку чекає зворотного виклику з двома аргументами,
об'єкт Помилка який є Об'єкт помилку або нуль з наступним
посиланням на об'єкт статистика.
Так що, якщо я думаю про те, що, Об'єкт об'єкт Помилка Статистика кома,
що вписується в парадигму бібліотеки цієї людини.
Так, я можу просто сказати, тому що Я не, другий аргумент
що це - що відбувається повинен бути прийнятий fs.stat
в зворотний виклик є помилятися, статистика за визначенням цієї бібліотеки,
Я можу поставити другий Ім'я аргументу тут
або що я можу перейменувати його
якщо я хочу з подальшим зворотним викликом тут.
Так, я можу передати один Вартість від сих до сих.
Тепер весь цей код, хоча за загальним визнанням зашифроване є
принаймні, скопіювати паста для більша частина з раніше.
Різниця лише в тому сповіщення тут я оголошую помилку
об'єкт і тепер я хочу щоб отримати трохи більш незвичним.
Я насправді хочу знати, що помилка була, так що я збираюся
укласти всередині даного об'єкта Майно умовно назвати код
так що я знаю, що це не файл
що має бути несанкціонованим, це HTTP 403.
Дозвольте мені пам'ятати, що, перш ніж Я передати об'єкт Error
у функцію.
А потім, нарешті спробувати прочитати файл, так що в цьому випадку
водоспад, я розбив код з двох великих етапів
на три дрібніші кроки.
Зверніть увагу на красу тут,
Я можу зателефонувати fs.readFile що проходить в дорозі.
А потім найскладніша частина подумки, це я просто передати
в зворотному виклику хлопця.
Справа він мене вручати, я збирається перейти на fs.readFile.
Тому що ми всі дотримуючись до того ж конвенцій,
Перший аргумент зворотного виклику є об'єкт помилку або нуль з наступним
по комі чи розділені Список корисних речей.
Отже, що це означає, що в даний час і, якщо я прочитайте документацію я буду знати,
це, в самий останній зворотного виклику, цей хлопець тут поза
квадратних дужок буде повинні бути передані в об'єкті Error
або нульовою, який я повинен перевіряти як завжди з цим кодом тут.
І то по визначенню цього методу
в документації хлопця, останнє значення повертається
З останнього методу в моєму анонімний масив -
мій масив анонімних функцій.
Отже, що ж читати повернення файл
і я використовую віддачу вільно зараз.
Я маю на увазі, що ж читати файл переданих як аргументи
методом зворотного виклику його руками?
Два аргументи, Перший Об'єкт Помилка або нульовою,
що майже завжди буде відповідь.
І друге збирається , То, що для файлу читання?
Вміст файлу, Дані, як ми називали його раніше.
Так, просто оголошуючи помилятися, привести,
і перевірити його на помилки цього є свого роду нудно зараз.
В іншому випадку, я роблю res.end проходячи в цьому результаті.
Це, безсумнівно, не виконувати синхронізацію в абсолютно
ні, поки ви насправді написати його самостійно.
Але зараз, прийняти від, принаймні той факт,
що є, мабуть, це загальна парадигма, згідно з яким, якщо ми
і автори бібліотек все начебто палиці
з цієї конвенції методів зворотного виклику.
І перший аргумент об'єкт помилку або нуль.
І другий і третій
і четверті об'єкти речі ми піклуємося про і ми сортуємо
з слідувати правилам і документація.
Ми почали з кодом, який чесно досить непривабливо.
І хоча самі останні Прикладом є відверто почасти важко
обернути ваш розум навколо, це принаймні візуально,
схоже, що це набагато жорсткіші.
І як тільки ви звикнете з ним, це набагато простіше,
і це набагато менш схильні помилки, ніж у попередньому прикладі.
Отже, дозвольте мені продемонструвати одна остання річ тут.
Це версія три.
І - Ні, давайте залишимо тільки в цьому один.
Відпусти мене в пару інші останні речі, як дражнилки.
Гаразд, в сервері 2.
ОК. По-перше, будь-які питання, Я знаю, що це багато
але ви хотіли більше інструкції, так?
Ви не сказали, добре інструкція обов'язково.
Так?
[Нерозбірливість Зауваження]
Правильно, ви істотно поблажливий до операційної системи
щоб з'ясувати, як жонглювати всі ці м'ячика,
читання з файлу, читання з бази даних.
І це на цей сервер Javascript Сам ось однопотоковий.
І по суті і фактично,
є одна картина Я не кинути,
і це не обов'язково все, що просвітницька
але, можливо, ми дамо Ви ментальна модель.
JavaScript сам і вузол
зокрема, має в цьому так званий цикл подій.
Причому, ви можете думати з node.js, програма,
буквально як нескінченний цикл.
Це просто дика цикл, очікуючи і чекав і чекав,
шукаю завдань, щоб закінчити.
І завдання може бути, піти принести щось з бази даних
або ось значення від бази даних або піти отримати цей файл
з диска або ось вимагати від користувача.
Будь-який вид події, так само, як приводом подія браузери,
оскільки сервер приводом паралельне захід.
І будь-який з тих речей, складають події.
Значить, хтось в node.js, просто написав у нескінченний цикл,
великий дикий цикл, очікуючи для матеріалу, щоб статися.
І, як матеріал і відбувається, то закінчується в черзі, чи не так?
Звичайно, база даних може повертати значення.
І файлова система, операційна система може повертати значення
приблизно в той же самий час, але, ймовірно, буде
бути деяке впорядкування ім.
І node.js збирається істотно черги
як великий масив або вектор, деякі структури даних
що буфери всі з тих речей.
Тому що він може буквально тільки обробляти один з них за один раз.
Отже, коли ви, розробник,
писати асинхронний JavaScript код за допомогою асинхронного
Функція, ви дозволяєте це так званий цикл подій, щоб піти
в наступному тику, чи не так?
Так, поки ви відразу повернення всіх
з цих асинхронних методів подобається файлу для читання і стат,
вони негайно повернутися бо зворотного виклику в кінцевому підсумку
повернеться.
Як тільки ви повернетеся,
це означає, що хтось ще може отримати виштовхується акції тут
або що він може отримати виштовхується на початку черги тут.
Так от, є в Справа в тому сериализации
з усього, що відбувається,
хоча всі ці речі може бути відбувається паралельно
на багатопотокової системи.
Але node.js себе і сервер бігли
як одного потоку.
І вниз сторона, що є т ви не обов'язково макс
з вашого комп'ютера можливість є як особливо
якщо у вас є 16 основних або навіть 2 ядерний комп'ютер
і ви просто працює один примірник вузла.
Але якщо у Вас є знову прийнято щось на зразок 161,
вам уникнути величезний кошмар на головні болі, коли мова йде
раси умови і замки і семафор
і писати по-справжньому багатопотоковий код,
так плюси і мінуси.
ОК. Отже, повернемося до коду тут, дозвольте мені запропонувати, що ми починаємо
спростити речі небагато.
Ми бачили один сервер трохи назад, який виглядав так.
Отже, ось, мабуть досить просто.
Але, як і в світі з PHP, є рамки
як Laravel і є речі, як Rails і Django,
те ж саме в Node.js світі.
І ми будемо витрачати більше час на це в середу
і в наступному проекті.
Але якщо я йду в сервер 2 каталогу,
помітити пару парадигми тут.
Так що це - там збирається бути еквівалентно приклад
але він використовує база називається express.js,
який є безкоштовним з відкритим вихідним кодом програмне забезпечення, як Rails і Django,
як Laravel, це просто в кінцевому підсумку збирається
бути недооціненими сьогодні Тому ми писали
такі прості приклади.
Але нам довіряють.
Це буде дуже швидко стати вашим другом
тому що це врятує Ви багато TDS коду.
І загальна парадигма express.js додаток
Щоб мати app.js або server.js файл, який містить логіку
вашої програми або, по крайней міру точка входу.
Ви можете мати декілька файлів.
Підкаталог вузла модуля який має бібліотеки
що ви завантажили як Async
і виразити себе в інших.
А потім package.json, package.json виглядає так,
і ви можете створити його вручну або інструменти створення його для вас
і це буквально файл JSON
і найцікавіше є залежностей тут.
Так само, як в Laravel, ви було, що каталог постачальників
і потрібно було турбуватися про пакети і робити -
насправді оновлення з Artisan або подібні команди,
бібліотеки ви встановили,
аналогічно з package.json тут і ви керувати бібліотеками
і версії що ви дбаєте о.
Так що, якщо у мене є package.json, Я можу просто зробити НПМ,
Вузол Пакет Manger встановити, це буде автоматично шукати
в той package.json файлу.
Подивіться і подивитися, чи потрібно мені мати останню версію
всіх модулів постачальників
у вузлі підкреслюють модулі каталог тут або, може бути
в деяких з батьків або предок каталог.
А якщо ні, то це збирається завантажити їх
і ви побачите цілу купу
з HTTP речі відбувається по мережі.
Так, наприклад, нехай мені показати вам вміст
модулів вузлів просто висловити.
Дозвольте мені йти вперед і сміливо видаляти модулі вузлів
так що все, що я є зараз, це.
А якщо я НПМ установки, ви будете бачити, що він збирається читати
що package.json файл і ми бачили вихід схожі
на це в світі Laravel.
Це скачування ціле зв'язка матеріалу, і це
тому експрес в свою чергу залежить від цілого букета
інших народів бібліотек.
Таким чином, всі ті, є свого роду завантаженні рекурсивно.
До цих пір, якщо я це зроблю в LS знову,
є мої модулі вузлів Каталог назад
і висловити, як повернутися.
Так що це просто спосіб спрощення управління пакетами.
Тепер, якщо ми подивимося на app.js файл, це буде
бути повернення до наша рання веб-сервер
де ми просто плювати з "привіт, мир".
Але зверніть увагу парадигми тут,
Перший ми вимагаємо експрес модуль, тобто цей рядок
коду, який ви знаєте з документації.
Ви буквально лікування, що змінна модуля у функції,
так відкриває дужка близько дужка означає виконати його.
Це збирається мабуть, повернути щось ми збираємося
зазвичай називаємо додаток.
Як це працює?
Я дійсно не знаю.
Я дам хтось ще, ви знаєте, в експрес світі пишуть, що.
Я збираюся зараз стоять на Його плечі так,
зробити свою заяву працює трохи простіше.
Тут я збираюся слухати на цьому конкретному порту
які можуть бути чим завгодно.
А ось код, це може бути, більше нагадує зараз
з Laravel і routes.php.
Так що це вечеря просто, я просто хочу, щоб вказати маршрут
для косою зірки, так що всі збирається бути поглинені
цим обробником запиту.
Парадигма для обробки запиту є його анонімна функція
з аргументом запиту
і об'єкт відповіді як і раніше.
І res.send в експрес-засоби Ви відправляєте код потім
на все, що ви хочете відправити.
І, звичайно, ви можете зробити щось любитель
насправді відправки файли або HTML
або динамічно генеруються Зміст.
Але на сьогоднішній день, все, що ми зробили був виплюнути Hello, World.
Якщо ми йдемо в сервері три, це навіть любитель просто
щоб показати вам деякі функціональні можливості.
І ми покажемо вам ще сексуальніше версія
це в середу.
Але якщо ви коли-небудь чули сокета IO може бути,
таким чином, я думаю, Джонатан або хтось сказав раніше,
одна з речей, вузол справді відомі
для це його в режимі реального часу поведінку, чи не так?
Подумайте про PHP в MySQL, якщо ви були реалізувати чат сервер
в PHP в якому дві людини могли відкрити вікно браузера, щоб foo.com
, А потім почати IMing друг друга, Аліса в одному вікні,
Боб в інший так, щоб кожен з них бачить його
або її повідомлення в інше вікно.
Як би ви це зробити в PHP і MySQL?
Використання або не використання Laravel роду з несуттєво, ви можете мати
як файл index.php.
І ви повинні мати - в У деяких випадках він отримав плюнути
з форми, так що буде HTML форма
що, ймовірно, представляє не через нормальний відправки форми
але Аякс ймовірно, чи не так?
Так, на представити обробник, так ви вводите в текстовому полі,
ви потрапили введіть, а потім він отримує відправляється на сервер за допомогою Ajax.
Що ви тоді зробити на сервері?
Отже, ви отримали index.php
або щось точка PHP це отримав в параметрі HTTP
від користувача, Аліси або Боба миттєве повідомлення, що ви робите
з ним для того, щоб поширювати її Бобу або Аліса, відповідно?
Я маю на увазі вас буквально є інструменти, з якими
зробити це у вашій хв.
Бо те, що ви могли б зробити?
У вас є одна хвилина, щоб реалізації цієї програми.
Так?
[Нерозбірливість Зауваження]
Прекрасно. Право, так у вас є база даних.
Ми знаємо небагато Трохи про MySQL.
Так, у вас є таблиця от повідомлення,
Можливо, є раз марка, ідентифікатор користувача,
Тіло повідомлення Сам створив, що,
оновлення, що і все, що.
Таким чином, ви зберігаєте в базі даних.
І припустимо, що Аліса посилає Перше повідомлення, як же Боб отримати
що повідомлення зараз з бази даних?
>> Це можуть бути деякі Аякс відповідь, яка постійно відбувається
назад в базу даних топ отримати [нерозбірливо].
>> Ось саме.
Так код Боба хто код так само, як Еліс є тільки вид
симетричного відносини,
Браузеру Боба має деякий код Ajax це, ймовірно, може бути, кожен 30
секунд потягнувши сервер за допомогою Ajax синхронізації,
є нові повідомлення?
Є нові повідомлення?
Кожні 30 секунд відбувається щоб бути почасти субоптимальний
тому що він повинен чекати ще
якщо Аліса буквально тільки що відправив повідомлення.
Так, браузер Боба міг кожен другий вдарив сервер.
Але це означає, що Еліс браузер звернень до сервера
кожну секунду.
А як щодо Чарлі [Передбачається написання]
і Девід [передбачається написання] і Едвард [передбачається написання]
і будь-який інший лист алфавіту?
У чому проблема цього підходу?
Багато хітів надмірних -
Я маю на увазі, ви просто ефективно Спосіб застосування власний погляд
або DDOSing, розподілених Атака на сервіс
на власному сайті, маючи всі
з цих користувачів запустити Javascript код, який просто діагностики
чорт із вашого сервера навіть якщо довільне число,
80 відсотків часу ніхто не сказав нічого
в чаті.
Але ви просто перевірка щоб переконатися, що з таких.
Значить PHP у великій кількості мови просто не добре
реальному масштабі часу, комунікацій.
Тому що в PHP відкликання є немає центрального пам'яті, чи не так?
У вас є сесійних об'єктів яка створює ілюзію
центрального зберігання, але ось на кожного користувача.
Ви не повинні глобальної пам'яті як ви робите в Java Servlet
в знайомі або в іншому рамка працює так.
Node.js, хоча, ви повинні глобальної пам'яті, тому що ти є
один сервер і що 'може пам'ятаю все, що хоче
про всіх користувачів.
І ви, можливо, все ще є база даних.
Але хороша річ про node.js теж, що це набагато краще,
ніж щось на зразок PHP і створюючи ілюзію
робота відразу з декількома речі відразу.
І справді, як і в сторону, ви можете реалізації чату в PHP,
але ви, як правило, роблять те, що називається довго опитування
в якому ви не луна сервер кожну секунду.
Ви зв'язок з сервером, сервер не відповідає вам
для вгору 30 секунд, він буквально сидить
в циклі очікування і сподівання.
А сервер перевіряє, є нові дані в базі даних
і тільки один раз його допомогою ви бачить: «О, ось повідомлення від Боба, "
це відповідь на сервер ПВТ?
Таким чином, ефект у вашому браузері є те, що значок IE або Mozilla
або що просто тримає спінінг протягом 30 секунд за один раз.
Але зовнішня сторона, ви не є 30 запитів на підключення
за 30 секунд, у вас є.
Так це називається довго опитування.
Але ще краще в сучасній Мережі браузери дещо, зване
WebSocket, які ви берете на себе CS143,
можна ефективно зробити Підключення TCP від ​​клієнти
як браузер до сервера а потім повісити на нього
без використання майже як багато ресурсів
як HTTP може традиційно роблять.
І гніздо вводу-виводу node.js бібліотека
що робить його набагато легше виконання з'єднань сокетов
або ілюзії там на для старих браузерів
так що ви можете реалізувати це реальна функціональність Час вийшов.
Отже, ось приклад.
Цей матеріал нагорі отримує трохи складніше
але це в основному скопіюйте і вставте від документації socket.io 'и.
Ось тепер більш точне обробник запитів.
Якщо запит користувача слеш, який файл я збираюся
бути, мабуть обслуговувати до них?
Index.html.
І є деякі нові матеріал тут потік
які я покажу вам, через хвилину.
Але це всього лише ще один спосіб
з захоплення подати трохи більш ефективно
ніж просто робити fs.readFile.
Це трохи розумніші особливо для великих файлів.
Так коротше кажучи, ці лінії тільки, щоб служити
до файлі index.html
який на даний момент вважати, містить HTML форма, за допомогою якого Аліса
і Боб можуть повідомлятися.
Нарешті, io.sockets.on, так що це походить від цієї лінії тут.
Так, я зараз якраз читаю документація io.socket дає мені
доступ до так званих WebSocket за допомогою браузера,
між браузером і сервер.
Я слухаю для спеціальних Підключення подія, яка кошти
коли користувач спочатку парад сервер намагається
, Щоб відкрити цей зв'язок, я буду називати цей виклик назад.
А тепер, я збираюся зробити наступне.
Кожні п'ять секунд, що я збираюся робити?
Я збираюся випускають або трансляції якщо ви пам'ятаєте подряпини,
графічний мова буде що транслюється блоки?
Таким чином, ви будете випромінювати
або викликати захід під назвою довільно з сервера.
І це буде містять повідомлення Ping
і поточна дата.
Таким чином, це є актуальною чат сервер, що Аліса
і Боб можуть використовувати, але це свого роду автоматизованої чат-сервера
де повідомлення тільки вид сонара пинги.
Це просто дата в час, відправляються кожні п'ять секунд.
Так що, якщо я насправді працювати цей справа - і ось воно що.
Щоб було ясно тут, повідомлення це тільки на вході сюди.
Отже, дозвольте мені звернутися закривати очі на що.
Дозвольте мені зробити вузол app.js.
Пустіть мене до моєї браузері.
Оновити домашню сторінку тут.
[Пауза]
І дозвольте мені закрити інспектор.
Кожні п'ять секунд, у мене є демонстрація хоча і не
інтерактивні для людини
з чогось, що відбувається асинхронно.
У повідомленні браузера немає значок спінінг.
Вона використовує любитель функцію з Chrome в сучасних браузерах
підтримки роз'єм підключення під капотом
і це те, що називається як правило, паб / суб модель,
публікації / підписки модель, де ми ще не зробили
, Що досить явно тут.
Але те, що приємно про це Взагалі паб / суб парадигма
що ви можете мати один видавець.
У цьому випадку Центральний сервер і все
індивідуума браузери клієнтів.
Аліси і Боб з Світ може підписатися на нього,
так що ви можете передавати повідомлення серед будь-якого числа користувачів.
І хоча знову ми не бачачи інтерактивність,
у нас була, може бути, 12 ліній коду просто це зробити.
І це, ймовірно, не є високосним уявити собі, як ви можете на швидку
з файлу index.html що має справжню форму HTML,
Трохи JQuery коду з Аякс, що не надсилає днем
але просто посилає все Аліса або тип Боб на сервер
а потім сервер ретранслюватиме його.
І я обіцяю, щоб кинути погляд на одній речі просто
дражнити вам у цьому.
Якщо ми йдемо в потоці нулем і одиницею,
Ви побачите код, який просто трохи відрізняється тут.
Точно так само ви бачили його, цей альтернативний
до того, що я назвав fs.readFile Метод раніше, в результаті чого,
Ви можете сказати node.js "Ідіть читати цей файл в пам'ять.
Але якщо це великий просто дати мені шматок у той час ».
І ви знаєте з CS165
або 161 файлові системи мають різні
експлуатаційні властивості.
Ви можете прочитати в блоках по 512 байт
або 2 кілобайт або що завгодно.
Це оптимізувати спосіб повертаючись з файлу итеративно
так що ви можете викласти його трохи більше швидко
в браузер або хто кінець клієнт.
Так величезна кількість змісту сьогодні, і ми збираємося пірнати
більш детально в середу з Тімом [передбачається написання]
зокрема, дивлячись на, як ми може перевести деякі з ідей,
від першій половині Звичайно Laravel і моделі
в бібліотеку, що він сам написав називається Bookshelf.js
яка стає все більш популярні в суспільстві
тому що це дає вам велику його частину,
якщо не більше Функціональність красномовним
який нагадаємо, що Бібліотека проникливість Laravel,
так про це і більше, як
розробити повноцінний додатки в середу.
Адже ми тоді.