>> Добра.
Так захапляльным было, што ёсць 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
ці мой кампутар, а затым націсніце ўвод.
Гэта на самай справе выглядае 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,
так пра гэта і больш, як
распрацаваць паўнавартасны прыкладання ў сераду.
Мы ж тады.