>> Ред.
Па cliffhanger е, она што е node.js како што го знаеме денес?
Нешто? Да?
>> Тоа беше како рамка пишување вклучите Javascript-
апликации во голема мерка -
>> ОК, тоа функционира.
>> - Знам како Заедничка употреба како -
или нешто што може да направи е како -
[Беззвучен Забелешка]
>> ОК добро.
Да, па тоа е рамка.
Тоа е алатка со која можете може да се изврши JavaScript код
серверот сајт.
Ова може да значи наједноставниот на работите
како пишување командната линија скрипта не во Python или баш
или Руби или PHP, но само во JavaScript себе
и негово извршување на трепка командната линија.
Или вие всушност може да работи тоа во рок од веб серверот.
И во фактот во рамките на node.js себе,
оваа рамка е целиот куп библиотеки меѓу кои се
во серверот за HTTP вграден.
Значи, вие всушност може да напише сервер како што ќе видиме
во само еден миг, супер лесно од само за разбирање малку
на HTTP и TCP и пристаништа.
И можете да потомство слушање веб сервер без Apache-то,
без IIS на Microsoft.
Без какви било други инсталираниот софтвер,
можете само да потомство овој и да го слушнете на повеќето било кој порт
на систем кој сте дозволено да.
Па случајот и поени, дозволете ми да одам и да се отвори
до овој пример, сервер-0.js.
Така да се забележи дека на врвот на оваа датотека, само еден куп
на неинтересен коментари, и потоа, тука е неколку
на претставник линии на код дека ќе видиме recurringly.
Значи, var HTTP добива бараат со "http".
Па вградени во node.js " инфраструктура е целиот куп
на модули кои се навистина само библиотеки и сè е вид
на име простор со единствен идентификатор
вака еден е "http".
Така што како и во многу јазици како Java и C + +
и Ц, само вие кога увоз или вклучуваат
или во јазол зборуваат бараат модул прави нејзини делови.
И сите меморија бара да се натоварени
во RAM меморија и затоа се користи.
Значи, може да се вид вчита оваа библиотеки или модули на побарувачката.
Ова значи оди напред и да бараат
за оваа програма на HTTP библиотека,
а се однесуваат на таа библиотека од начин на променливата наречена HTTP.
Но, ова левата рака симбол може да се нарекува ништо, foo,
бар, Баз, тоа не е важно.
Па за разлика од C + + и Java и Ц, каде, кога ви се потребни
или увоз библиотека, тоа само вид
на станува глобално достапни,
node.js модули се поцврсто именски простор.
Така што свој - кој функционалност е достапен само во моментот
по пат на ова име на променлива.
Вие не може само да почнете пишување методи кои постојат
во тоа право начин што е веројатно добро,
затоа што тогаш вашите именски простор не се ни приближно како преполни
како и во многу јазици.
Добро, па сега како заеднички предлагам, создавајќи серверот за HTTP
како Џонатан [претпоставува правопис] беше можно е буквално
едноставно како повикување на создаде сервер метод внатре
на HTTP модул.
Значи, ова се враќа референтната
до некој вид на веб серверот.
Станува збор за Apache, не мора толку тешка категорија.
Оваа една е малку поедноставно.
И сега, јас треба да се само едноставно направи неколку работи.
Значи прво, дозволете ми да дојдете надолу кон дното тука
и да скокнеш управувачот метод за момент.
И ќе забележите оваа линија код,
server.on кое е суштина значи серверот -
слушам како во jQuery код,
слуша за настан наречен барање
и само се погоди што да правам
кога барање настан пожари во серверот.
Да?
>> Јавете се на функција управувачот.
Значи, буквално се изврши код кој е референцирани
со оваа променлива, а всушност не е променлива симбол тука,
што е тоа симбол однесуваат на?
Па, ова име функционира тука
и управувачот очигледно зема два аргументи.
Зошто две? Па, ако само прочитајте ги нема документација
за овој посебен модул, ќе биде кажано дека на управувачот
која ќе биде повикана да биде донесе најмалку два аргументи,
упатување на барањето,
и во внатрешноста на барањето ние буквално значи HTTP барање.
Значи, сите оние HTTP headers кои може да се сети
од почетокот на семестар или некои претходно класа
или искуство како добие линија и домаќин линија
и Кориснички Агент линија, сето тоа е внесен и повеќе во внатрешноста
на ова барање објект.
И одговорот објект е подредени за излезни податоци.
Значи, вие треба упатување на предмет што се случува за да ви овозможи
да се испраќаат информации назад кон прелистувачот со повик на методи
на тој Вториот аргумент наречен Рез за одговор.
Но, ова може да се нарече foo или бар, ова се само конвенции.
Па сега, она што можам да направам?
Па, се чини дека внатре на овој супер едноставен веб сервер
дека јас сум спроведување, јас сум ќе го направите следново.
Одам да се напише на HTTP заглавието со статус кодот 200,
200 значење во ред, се е добро.
И тогаш, јас ќе одам да помине на очигледно.
Што е податочен тип на Вториот аргумент кон десно глава?
>> Тоа е објектот?
>> Тоа е објект со колку клучеви и вредности?
Само еден од секоја, десно, една клучна вредност на пар.
Значи, "типот на содржина".
А единствената причина зошто Јас сум тоа цитирајќи тука е
бидејќи цртичка може да биде измешано за минус
или нешто слично.
Значи, морам да го цитирам тука, singe или двојни наводници.
Но, повторно заедничка парадигма
во JavaScript кодот е често единечен наводник овие денови,
дебелото црево, а потоа вредноста.
Значи, ова е само т.н. ум тип.
Ова е HTTP заглавието тоа е буквално ќе
да биде задоволен цртичка тип дебелото црево текст коса црта јасно дека се случува
да бидат испратени од сервер на прелистувачот
така што на пребарувачот знае дали да ја извршите оваа како RAW текст
или HTML или како слика или филм
или флеш датотека или ништо друго.
Сега, каде можам да всушност сакаат да се испрати во телото на страницата?
Па, само со читање документацијата
за одговор објект внатрешноста на оваа библиотека.
Гледам дека има право метод и дека зема стринг,
можеби други работи, но минимално стринг.
И низа е она што е плукаат на прелистувачот.
Во овој случај нејзиниот супер едноставен, нејзините Здраво светот,
но тоа би можело да биде opne заградата, HTML, блиску заграда,
отворена заграда ја главата, затвори заградата и така натаму,
ова може да биде Суровини HTML.
Но, ние сме чување на пример едноставно со само плукање
надвор наједноставниот на ум видови кој е веројатно text / plain.
А потоа Response.end само значи затворите конекцијата
и го испрати се што имам вид на ублажен внатре
на овој објект назад на прелистувачот.
Јас сум сторил. Во ред е.
Значи, последното нешто Јас го правам овде
и ова е нешто произволни и замислена да биде кул,
е јас сум кажува сервер конечно да се слуша
на одреден TCP од стандардната порта.
Потсетиме од почеток на класа која услуги -
или обично уникатно идентификуваат тоа со бројки,
АД е на интернет, 443 е HTTP врз веб-сајтови, 22 се на SSH, 21 е FTP
и 1337 е само произволни но тоа е повисока од 1024
што значи на повеќето системи, можам да го користам
без потреба супер корисник привилегии.
Па тоа е само удобен.
Но 8080 е во off - заедничка еден, 8088, навистина ништо големите
во илјадници како заеднички но ова е само уште елита.
Добро, така што ќе се случи кога јас всушност ја извршите оваа?
Па, јас не само посетете страница во прелистувачот.
Оваа датотека се нарекува сервер-0.js.
Бидејќи повторно, Apache е сега е надвор од сликата
за втората половина на курсот.
Ако сакам да веб серверот, јас треба да се напише
а потоа ја извршите оваа веб серверот.
Но излегува дека го вклучите Javascript- и на клиентската страна
и од страна на серверот е толкува јазик.
Значи, сè што ми треба е преведувач.
Па it's - ако инсистираат да се кандидира јазол, а потоа на серверот 0.js,
Јас може или не може да се види некои излез во зависност
на она што библиотеки јас сум вклучен, ништо не чини да се случува.
Но, дозволете ми да оди на пребарувач и дозволете ми да одам
на иста IP адреса на мојот CS50 клиенти.
Но ова може само како и да биде мојот Mac
или мојот компјутер, а потоа притиснете ентер.
Кој всушност изгледа како Апачи.
Тоа е како на директориум листата баравме
на во првата половина.
Значи, она што го правам погрешно?
Да.
[Беззвучен Забелешка]
Точно, нели?
Значи, Apache-то се уште слушање на стандардната порта 80.
Иако јас би можел да го промени тоа, Можев да го исклучите сите заедно
но тоа е уште работат.
Но, овие момци можат да сигурно коегзистираат.
Јас едноставно треба да се стави дебелото црево 1337, а потоа можеби
или можеби не е коса црта на На крајот да пристапите на оваа порта
дека ова работи овој сервер е.
И сега гледам дека Здраво, Светот се врати.
И јас може да ја погоди Вчитај како пати колку што сакам,
тоа е уште служејќи се една страница.
Всушност, ако јас отвори Хром инспектор, одете на мрежата
и повторно вчитајте ја целата страница,
забележите дека навистина ова беше барањето што беше испратена.
Ако гледам во Суровини извор,
забележи мојот пребарувач ја испраќа сите оние нешта.
А потоа одговорот од серверот беше супер едноставна.
Тука е 200.
Ако тоа не е премногу низок на екранот,
постои типот на содржина.
А потоа node.js вид на автоматски
за мене, додаде датумот и сите други работи
дека пребарувачи обично очекуваат.
Значи, ајде да ја видите малку здрав разум чек.
Дозволете ми да се врати на код во серверот 0.js и дозволете ми -
секој пат кога ќе одам во на управувачот,
дозволете ми да кажам console.log.
("Имавме посетител! ').
Јас не треба да го прекомпајлирате или нешто слично,
тоа е препознаена јазик.
Па сега, дозволете ми да се врати на страница, превчитате еден, два,
три пати и да си одат Назад кон мојата прозорец.
И сега гледам ова.
Па тоа е чудно, Гледам шест линии.
Интересна веб trivia, зошто Јас се шест барањето не три?
Да?
[Беззвучен Забелешка]
Да. Значи, како што можеби знаете на малку глупаво икона во горниот
на прелистувачот бар дека многу
на веб-сајтови користат сила биде Харвард сртот,
тоа би можело да биде компанија логото или нешто слично.
Значи, пребарувачи овие денови вид
на надменно направи дополнителни HTTP барање
до речиси секој веб-сајт кој кои ги посетувате проверка, ако постои
стандардно датотека наречен favicon.ico
во истиот директориум како на датотеката баравте.
И ако е така, го става иконата таму.
Така што сите сме сведоци е токму тоа.
И во фактот, ајде да видиме, ако ние може да се види ова, наместо тип
од само "Имавме посетител.
Дозволете ми да оди напред и излез.
А јас само знам ова од гледање на документација.
Има имот во внатрешноста на барање објект наречен рачно
кој се случува да биде на патот
кое се бара во вистински URL-то.
Значи, ако јас го рестартирате на серверот едноставно со rerunning јазол
на серверот 0.js и сега го правиме ова еден, два,
три и се врати овде.
Ете го.
Црта е она што јас - човечкиот бара
во favicon.ico е што прелистувачот е
надменно бара.
Но поентата не е толку многу favicon работи
но како на серверот е управувана.
Да?
>> Зошто кои имаат да бидат некои барање?
>> Зошто кои треба да - од природата на тоа како HTTP работи.
Значи, HTTP само може да побара една датотека во исто време.
Прелистувачи може да се паметни овие денови
и да ја задржите на TCP врска отворени.
Ако сте ја CS143 или општо запознаени со мрежи,
па може да се добијат подобрување на ефикасноста
со одржување на мрежата сокет отворен
во правењето на повеќе HTTP барања сериски над неа
но тие се еден фајл на барање.
Значи, ако ја посетите нешто како -
Мислам ние може да оди на повеќето било веб-сајтови.
Ако одите на - да се повлече до инспекторот на Хром тука.
Тоа може да се добие пополни повеќето на страната.
Оди на табот мрежа и да одат во www.cnn.com.
И кога ќе ја посетите cnn.com, неговите почетната страница од пребарувачот -
Вашиот прелистувач наместо atrociously прави - уште бројат.
OK. Најмалку 289 HTTP барања повторно и повторно.
И ова е причината зошто, кога ќе ја посетите особено подуени веб-сајтови,
тие се бавно да се вчита бидејќи на сите
на средствата тие се подигне.
Значи, тоа изгледа како 298.
Може да има некои Ајакс случува во овој момент или некој
на средствата се само ниски.
Значи, секоја од овие е индивидуално барање да се вратам
и назад, напред и назад.
И тоа е причината зошто порано, дури и иако ние вид на зборуваше
за тоа малку fancifully каде да се стави на сценариото таг,
апсолутно го прави разлика кога ќе има -
го пушти да имаат многу на сообраќајот и многу
на датотеки се бара.
И секоја од ова претставува веројатно слика, медиумска датотека,
го вклучите Javascript-датотека, CSS датотека или слично.
Значи, ние сме веќе до некои 4 мегабајти само
да се погледне на вести денес.
Добро прашање.
Во ред е.
Значи, она што се некои од квит сум иако?
Право, знаеме како да се направи веб страни веќе со PHP.
И многумина од вас дојде на класа знаејќи Џанго
и Python или шини со Руби.
Значи, зошто не ни треба уште еден јазик и инфраструктура?
Што е node.js особено добри во, ако знаете?
[Пауза]
Нешто?
Не? Да?
>> Изневерување пораки.
>> Значи, изневерување пораки.
Значи тоа е точно и тоа е вистина за повеќе технички причини
и дека node.js и навистина JavaScript е особено
добро прилагоден за асинхрони код,
ако при што ќе се создаде илузија
на вршење на повеќе работи одеднаш.
Значи, иако тие се навистина се случува сериски,
навистина во повеќето случаи, Го вклучите Javascript-и двете клиентската страна
и серверот е еден навој.
Кои, ако сте преземање 161 или дури и 61 значи дека -
на оваа програма се знае,
толкувачот може буквално само се направи една работа одеднаш.
Но, ова не е одлична за нешто како веб сервер
каде што би можеле да имаат десетици или стотици или можеби дури и илјадници
на корисници сите се обидуваат пристап до вашата веб страница
на самиот исто време.
А сепак, кои укажуваат на дека со нив еден
по друго по други особено ако некои
на оние барање како што видовме на CNN може да бара издржување
до додадени фајлови: 300, пред да дури и дојде до следното корисникот
кој сака да ја види вели вест.
Node.js е подобро прилагоден за средини како што.
Затоа што она што се случува е било бавно крената процес
како да читате датотеката од диск или доведување во прашање на базата на податоци или зборува
на некои други мрежен сервер,
што има тенденција да имаат латентност, нели?
Ако се земе 61 или 161 особено сите од овој вид
на периферни услуги имаат тенденција да биде многу побавно
од тоа ништо внатрешноста на истиот RAM и истиот процесорот
кои велат дека во овој случај серверот е, всушност, трчање.
Но она што е убаво за node.js е дека можете да -
и го вклучите Javascript-поопшто е тоа што можете да направите нешто
а потоа велат: "Хм, ова ќе
да ми потрае неколку милисекунди или дури и за неколку секунди.
Дозволете ми вид на вилушка дека надвор " но тоа не е точно процес.
И тогаш кога тоа е направено прави дека бавно крената процес
како грабање редови од база на податоци или читање на датотеката. html
од дискот, тоа ќе да се вратам на мене, а
од мене да се чека за неа.
Значи, да се направи овој појасни.
Ова е мојот начин на правејќи го овој повеќе запознаени.
Добро, така што ова е Протресете колиба на плоштадот.
Ова е вид на заеднички парадигма
за објаснување asynchronicity.
Ова е всушност добра пример, бидејќи подаваат колиба
и вкусна Бургер се исклучително бавно за она што тие го прават.
Но поентата е дека тие се навистина добри во земање нарачки
и преземање на вашата пари по кои чекате за вашата храна.
Значи, ова е всушност подобро дизајн од алтернатива.
Бидејќи претпоставувам ќе одиме во продавница вака и ти да дојдеш
на предниот дел на линија и ќе стави вашиот ред и дека сакате
да плескавица, како најдобро можам да кажам, тоа трае најмалку пет
или повеќе минути за да се всушност плескавица.
Значи, тоа ќе биде вид на лоша бизнис модел
ако додека чекате за вашиот плескавица, Алис [претпоставува правопис]
и Боб [претпоставува правопис] и Чарли [претпоставува правопис]
а сите други се редат зад вас
и ти се буквално блокирање линијата на чекање за вашата храна.
Па очигледно, на подаваат колиба
и други за брза храна места не го направите ова,
тие прават нешто како ова.
Тие ви даде сирена.
И тие вид на ви испрати на вашиот пат.
И тие ти се јавам назад од страна на правење оваа мала работа да вибрира
или флеш да го добиете вниманието.
Значи, ова е буквално она што?
Нешто како node.js прави.
Ако node.js или го вклучите Javascript- поопшто се користи
и програмер е доволно паметни
да се реализира, "Знаеш што?
Што и да треба да се направи во право тука може да потрае некое број
на милисекунди или секунди.
Знаеш што?
Дозволете ми да оди напред и да не го нарекуваат синхроно -
"Тоа е човек блокирање сите останати во линија ", -
дозволете ми да оди напред и да вид на се повлече
и едноставно си се јавиме
кога тоа долго трчање операцијата е завршена. "
И се јавиме на курсот алудира во овој случај
на повратен функција, повикување на Чак код
кои ќе се извршуваат кога вашиот плескавица е подготвена,
слично како ова нешто има некои вид на функционалноста вградени во
дека тоа започнува вибрира или зуењето кога е време за вас
да се нарекува назад кон предниот дел на линија.
Значи, она што го прави ова значи во реални услови?
Па, ние треба да се работат на патот до.
Значи, дозволете ми да оди напред и го правиме ова во прв план.
Во серверот 1.js, дозволете ми Првиот Поедноставување на кодот
да можеме да се бебе чекори кон повеќе привлечни проблем.
Ова е иста програма која ја напишав порано.
Но она што е променето?
Таму е еден вид на мало синтаксички разлики
помеѓу овој и Верзија 0 Пред момент.
Што јурнува нанадвор на вас, ако се сеќавате?
Да Синтија [претпоставува правопис]?
[Беззвучен Забелешка]
Да. Па сега, имаме линија на функцијата се пренесува внатре
Ние сме добиле ослободи од тој вид
на бескорисни име управувачот функција.
Бескорисни само во таа пред дури и го повикува во едно место,
Јас навистина не треба да се трошете време давајќи му име
и го прави потешко да се прочитате код врвот до дното.
Значи, ајде да се изјасни РЕГИСТРАЦИЈА е анонимен функција.
И јас го правам две други работи.
Јас сум подобра употреба на точка нотација.
Па како во jQuery, многу јазол методи може да се оковани заедно.
Така што откако ќе завршиш повикувајќи нешто, вие не мора
да почека до нова линија и се јавите на друг метод,
можете само синџир заедно.
И така на овој начин, може да се навистина заостри ова.
Значи, ова е буквално веб сервер во пет линии
на кодот Вкупно за разлика од -
за разлика од она што може да нормално треба да направите за да поставите нешто.
Ако одам во серверот 2 сега, ајде да го направиме тоа.
Во серверот 2 - всушност, да се врати на тој сервер 2.
Ајде сега се отвори async-0.js и решавање на тој проблем при рака.
Значи прво, ајде да одиме напред и отворен
до async-0.js во прелистувачот.
Па async-0, дозволете ми да одат назад кон интернет прелистувачот.
Хит Вчитај ја страната повторно.
И сега, ова е вид на порака за грешка.
Навистина јас сум гледањето на некој 500 во инспектор Хром.
Но, дозволете ми поточно побара hello.txt.
OK. Значи, ова не чини да работат.
Па async-0.js не чини да се сервираат нешто за коса црта.
Тоа нема стандардно датотека поддршка.
Но, ако јас експлицитно побара hello.txt,
што се чини дека да се биде поддршка.
Зошто е тоа така?
Па, она што јас сум качил тука
и направи се спроведува супер едноставен веб сервер
дека покажува каде што asynchronicity може да биде корисно.
И дека се спроведува како што следи.
Прво, јас сум со користење на HTTP модул, повторно,
но, исто така, FS кои веројатно се залага за?
Воопшто во CS, датотечниот систем.
Добро датотечен систем.
Оттука натаму Ф.С., датотечниот систем.
Добро, така што го прави ова да ми даде?
Функционалност поврзани со додадени фајлови како добивање помина,
отворање на датотеките, пишување директориуми, читање директориуми
и сето тоа вид на работи.
Па сега се забележи, овој код е иста како и претходно,
создаде сервер, минувајќи во анонимен функција.
Ова е вид на произволни.
Ова не е многу заштитени веб сервер.
Всушност, можете да пристапите повеќето секоја датотека на мојот хард диск
или на серверот тешко вози со извршување на овој код
бидејќи јас сум само слепо претпоставувајќи дека јас ќе одам
за да го дофати, без оглед на корисник бара во URL-то.
И јас ќе одам да префикс со точка
па дека јас сум малку се безбедни
велејќи она датотека што може барање има најмалку почетокот
во тековниот директориум.
Се разбира постои закана тука.
Затоа што ако тие наместо се она што?
На патот, тие можат вид на работи околу тоа.
Точка, точка, нели?
Значи, ако корисникот ставив точка, точка во URL-то, во теорија,
тие би можеле да започне да добива ми - и велат лозинка датотека.
Значи, ова не е замислена да се обезбеди,
тоа е замислена да биде едноставна.
Па еве, јас имам променлива која е конкатенација на точка
која е присутна директориум и URL на барањето
која ја видовме пред да се како намали и / или hello.txt.
Па сега, таа добива малку поинтересна.
Прво, информации дното.
Слушам на истата порта како порано.
Значи вистинскиот интересна работа е во внатрешноста на овде.
Секој пат барање доаѓа во по природа
на овој законик, што правам?
Апелирам датотека читање датотека метод на системот,
поминува во патот што сакам да го прочита.
И сега, ова е она што е интересно овде,
ова е со имплементација во асинхрон начин.
Вие не може да си ја повратат вредност од читање на датотеката.
Всушност известување, постои нема лев израз
од лево на прочитам датотеката.
Тоа не врати вредност.
Наместо тоа, го нарекува повратен повик функционира кога е подготвена
да ти го врати одговор.
Значи, повторно да бидат јасни, додека во недалечното минато,
во многу програмски јазици, ако си сакал
да се чита датотеката случај во точка PHP,
датотека црта добие истакне содржината,
имате левата рака израз во сите вредност по -
пред еднакви знак, тоа значи дека сте давање
на тој променлива враќање вредноста на таа функција.
Можете да го направите во node.js, но вие обично имаат
да се јавите експлицитно синхрони верзии на функциите се допаѓа,
Мислам дека тоа е се прочита синхронизација датотека или синхронизација прочитам датотеката.
Го заборавив како тие го нарекле.
И дека ќе им даде ќе се врати вредност.
Но, ако таа датотека е на некои оддалечени датотечниот систем
или диск е само природно бавно, тоа би можело да потрае 10 милисекунди
или 2 секунди за таа датотека за да всушност се врати.
Во меѓувреме, нема други веб посетителите се сервисираат
од Твојата Websit.
Ти си блокирање.
Тоа е она што се нарекува блокирање IO, влез / излез.
Па еве, ова е многу попаметно.
Затоа што она што се случува node.js
да се направи по толкување е следново,
тоа се случува да се јавите методот за читање на датотеката,
се обиде да една до датотеката која доби патот специфицирани од страна вредноста П
А потоа, ако и кога тој е подготвен да ви даде вратам на содржината
на датотеката Па, тоа ќе го наречеме функција чиј потпис е
од Конвенцијата следниве.
Два аргументи, прв од која е можеби еден Грешка објект,
капитал Е, тоа е објект наречен грешка или Нулев
ако не постои такво грешка.
И вториот аргумент - да земе претпоставка - ќе биде што?
Таа се вика податоци очигледно, но Што е податоци поконкретно?
>> Содржина?
>> Содржината на hello.txt во примерот, јас се повлече
во мојот интернет пребарувач пред еден миг.
Значи со други зборови да ја прочитам датотеката и многу node.js функции
како на не се врати вредности.
Тие го нарекуваат повикувања и да го положат
на оние callbacks што би биле традиционално
се врати вредност.
Главата на овој пристап е
кои може да се јавите чита датотеката со Т0.
Моќта повратен повик функција не да се нарече еден функционирам подоцна
така да се каже на T, таа може да се нарече T1000,
илјада крлежи подоцна.
Но поентата е во тоа што Остатокот од кодот во оваа датотека,
ако некој би веднаш да се изврши додека node.js
и додека го датотечниот систем фигури како да се прочита
таа датотека и да добијат назад кон вас.
Така ќе се создаде ова -
толку ефектно илузија
на паралелизам додека допуштајќи побавно водење процеси не е
блокирање на важни работи, делот кој сервисирање корисници.
Значи, како ние да се справи со ова?
Ова е многу честа node.js парадигма.
И таму е начин само да се поедностави ова е ќе видиме пред заедно.
Јас прв пат го означат Грешка не е нула.
Значи, ако тоа не е лажна тогаш имаше грешка.
Не знам што е тоа, можеби датотеката не постои.
Немав дозволи.
На патеката е во ред.
Било кој број на нештата би можело да тргне наопаку.
За сега, јас ќе одам да произволно врати 500
што е внатрешна грешка на серверот.
Нешто тргнало наопаку.
Јас навистина не се грижат да се дијагностицира.
Значи, ајде да се каже корисникот тоа е прекината.
И тогаш, јас ќе одам да се направи res.end,
и ова е стенографија нотација.
Потсетиме дека минатата пат кога го сторив res.write
и потоа направив res.end.
Ако само сакате да испрати една линија на производство,
можете само да го прават тоа сите одеднаш со res.end со аргумент,
и што се случува да се испрати Без оглед на порака за грешка е
внатрешноста на овој објект на прелистувачот.
Тоа беше прилично искрење потсетиме пред еден миг.
Јас немам идеја што е ова значеше на прв поглед.
Но, кога ќе побара датотека која не постојат -
Упс, ние треба да се кандидира серверот повторно.
Кога ќе побара датотека кои не постојат, EISDIR,
па нешто во врска со тоа се директориум,
ако јас не некои случајни низа таму,
очигледно тоа значи дека датотека не ни постои.
А тоа е затоа мојот код едноставно вели да се напише
од она што го Суровини Грешка порака е,
па не многу лесен но барем јас сум го ракување.
Друго, ако тоа не беше Грешка Што правам?
Истото како пред плукаат надвор 200 Добро, обичен -
text / plain ум видот и потоа плукаат на податоци.
И тоа е причината зошто јас сум добивање на содржината на hello.txt кои само
да се потврди дали Гледав на hello.txt,
тоа е буквално само Здраво, свет.
И ако јас се промени овој Здраво, свет, да ја зачувам датотеката,
повторување на серверот, вчитување на страната.
Сега, да се добие таа верзија.
Значи, јас сум навистина само reimplemented веб сервер
како што е постои многу години, но со користење node.js.
Но, можеме да го направите ова дури и повеќе демонтирани.
Дозволете ми да се отвори async-1.js.
Сега, забележиш јас сум додавајќи друг модул ова време,
очигледно патот модул.
Сега, ова е добар можност да се погледне
во она што документацијата изгледа.
Node.js е документација.
Како PHP мислам дека е всушност прилично добар
и право напред.
Ако одам во node.js и Google и потрагата по node.js пат,
она што ќе видите обично е директен линк до URL-то
дека јас ги постави овде пред еден миг.
Значи / API е официјално место да се обратите за документација.
И она што ќе видите на врвот
на официјалната документација јазол е сите методи и
или својства внатрешноста на ова особено модул,
од кои една е наречена придружи.
И да се приклучат е помошна функција тоа ќе ми дозволите
да не се мачи со сите предности.
И тоа е од дополнителна бонус како што ќе видите
од доковите тоа е, исто така, нормализира резултат пат.
Значи, ако корисникот или имате точки или точка точки или било која комбинација
на оние видови на релативната патеки, меѓу квит
на приклучија метод е тоа што тоа се случува да се исчисти сето тоа до
и да ви даде канонски пат без никакви
на оние точки или точка точки.
Значи, тоа е добра работа во општо за безбедност најмалку
ако сте проверка на врати вредност кои не сум
во овој конкретен едноставен случај.
Но јас не сакате да го користите.
Значи, јас сега се создаде пат на малку повеќе програмски
со path.join наместо на Суровини конкатенација.
Значи, тоа е малку почиста отколку порано.
И сега забележиш јас сум се малку поинтелигентен, а
отколку само слепо се обиде да ја прочитате датотеката,
Одам да се всушност јавете се fs.stat.
Значи, ако сте запознаени
со ниско ниво на C функции и Ц, па дури и PHP.
Многу библиотеки имаат оваа функција запишам враќа
во суштина статистика на датотеката, големината на датотеката,
дозволи, името и работи како што,
и, исто така, индиректно ако датотеката постои или не,
и ако тоа е датотека или директориум
или симболичка врска или нешто друго.
Па сега забележите, јас сум повикувајќи fs.stat.
А потоа очигледно според до документацијата,
Јас треба да се вратам во грешка објект
или Нулев проследено со статистика објект.
Но, ајде да се провери ова, node.js.fs.
Тука е датотека Документацијата на системот.
Дозволете ми да се погледне за статистика.
Има многу повеќе на функции тука.
Упс, тоа запишам синхронизација, fs.stat.
Па еве, тоа е асинхрони екипата (2).
Тоа е значи ако се сеќавам од главните страници,
Глава 2 од главната страница,
тоа значи дека ова е буквално само спроведување јазол
на ниско ниво систем функционира запишам.
Значи, повратен добива два аргументи, грешки и запишам
каде запишам е fs.stats објект.
Па ајде да видиме што овој објект би требало да изгледа.
Ајде да кликнете на хиперврска и гледам тоа.
Статистика објектот содржи очигледно некои помошник метод,
е датотека, е директориумот, е еден куп други работи.
Тоа е "е" датотека која е гајле за во конкретниов случај.
Па еве јас одам.
Ако има грешка, тогаш дозволете ми да кауција овој пат
и да се претпостави.
Ако има грешка, тоа беше веројатно 404 Датотеката не е пронајдена.
Тоа може да биде нешто друго
но јас сум се малку мрзливи тука само да се фокусира
на повеќе интересни детали.
Но, за на корисникот цели, на датотеката не е пронајдена,
дали имало било грешка наведување на датотека.
Инаку, дозволете ми да се провери дали датотеката е навистина вистински датотека.
Значи, ако тоа не е датотека, таа постои.
Има нешто таму, но тоа е веројатно директориум
или можеби симболичка врска
или нешто друго што е фанки на датотечниот систем.
Во секој случај, корисникот не треба да се види тоа.
Па сега, јас сум само ќе плукаат
надвор конвенционално неовластено 403.
Но повторно само конвенција,
Јас може да се користат нешто друго во теорија.
А потоа на крај, дозволете ми се обиде да ја прочита датотеката.
Значи, дозволете ми да дојдете долу.
И сега забележите ова е местото каде што го кодот може да се добие малку неуредна,
забележите дека јас го повикувам fs.readFile донесувањето
во истиот пат, исто повратен повик, како за последен пат,
па на претходната верзија.
А потоа, ако јас би се најдат -
ако не го најдете, Плукам од 500.
И ако јас не го најдете, што линија одиме да ја видите тука?
Ние ќе се види на FS пишува насловот 200 веројатно
и res.end испраќање вистинските податоци.
Но забележуваат тоа.
И ова не е демонстративна на најлошото сценарио.
Но имам оваа Повикот stat тука отколку што имаат некои нешта.
Потоа, јас имам друг асинхрони повик тука,
па повеќе вовлекување.
Значи, само вид на екстраполираме ако може од тука.
Што проблем има тенденција да се појават со јазикот како го вклучите Javascript-
во оваа средина, каде што немате враќање вредности
туку имате овие повикувања.
И, се разбира, ова е само стилски нешто фактот
дека јас се задржи вовлекување.
Но ја искористам оваа на логичен следен чекор.
Да претпоставиме дека имало една или две или три други функции
што ми требаше да се изврши што беа по природа асинхрони,
и затоа само вид на задржи вовлекување да се справи со нив,
да се справи со нив, за да се справи со нив.
Ќе добиете вид на повратен повик пеколот, како луѓето го нарекуваат
каде што е вашиот код почне да се добие многу широк
и искрено навистина тешко да се прочита.
Како што е, не можам да вид на едвај кажам дека ова е еден вид на проток
која има овој вид
на стилски аголни нешто се случува тука.
Значи, ова не е идеален, бидејќи овој многу брзо може да стане
тежок за употреба, иако две асинхрони не бара
толку голем договор.
Значи, ние би можеле да се избегне ова, нели?
Што може да се наѕира дека Јас misclicked пред еден миг.
Во документацијата, знаете, тоа отприлика изгледа таму е statSync.
И statSync не презема повратен повик како аргумент.
Таа ги зема само на патот, бидејќи тоа очигледно што прави?
Се враќа на пример на fs.stats.
Значи ова може да биде вашиот Првиот инстинкт, нели?
Особено ако повратен повик функции
и asynchronicity е малку ново за вас, искрено,
Најлесен пристап е веројатно само се избегне проблемот на сите
заедно, да се вратиме да го решите на CS101 стил програмирање
каде ти се јавам функција или метод, се враќа на вредност,
повик на функција, се враќа вредноста,
функција, се враќа на вредност.
И јас може да се користи поради тоа fs.statSync
кој е буквално истиот но тоа е синхронизирана верзија
што значи дека се враќа вредноста.
Тоа не донесе вредност на повратен повик.
Но, зошто би кои веројатно да биде неоптимална заобиколи да се прибегне
да синхрони функции?
Да?
[Беззвучен Забелешка]
Точно, тоа трае долго време.
Сте само забавување сето надолу.
Бидејќи многу како подаваат колиба или Вкусно Бургер, ако тие се ослободи
на оние звучни сигнали и сте го направиле, на клиентот стои во предниот
на линија до вашата храна е подготвена пред дури и преземање на ред
на лицето зад ти очигледно
преку стави успорува.
Луѓето почнуваат да замине, може да се вид подготви пакети.
Можете да направите било кој број на аналогии тука.
Но, во краток, тоа е веројатно не е добра работа
за бизнис или за серверот.
Па асинхрони кодот е обично добро најмалку
во овој случај, но тоа дефинитивно почнува да предизвика некои гнев.
И всушност јас се осмелувам да кажам, кога Првиот го пишувам овој материјал,
тоа ќе потрае малку малку се користи за добивање.
Значи, ајде да почнеме да им овозможат на вас со некои библиотеки
и техники да се направи ова е малку полесно.
Значи, еден од најчестите библиотеки се популарни библиотеки
овие денови, овој еден вика async.js.
И како многу node.js библиотеки или модули,
тие се сите со отворен код.
Тие речиси сите живеат и се центар складишта кој е вид
на стана де факто место за чување на овие работи.
А потоа, тука е целата инфраструктура
за инсталирање на овие нешта наречен НПМ, Јазол менаџерот за пакети
кој ако сте запознаени со EvanTube е вид
на како стан или стан добие.
Ако сте запознаени со Red Hat и Fedora
како во апаратот, тоа е како yum.
Но тоа е еден јазол - тоа е менаџер за пакети само
за ова конкретно на животната средина.
Значи, ние може да го симнете и инсталирате работи како async библиотека
и, исто така, уште еден наречен истакне библиотека или модул.
Но, овие колку FS, HTTP, пат,
тие се сите доаѓаат изградена во јазол.
Значи, ако ние одиме кон API документи, вие всушност ќе се види дека изградена
во јазол ќе добијат бесплатно целиот куп на модули.
Но многу убави луѓе на интернет го направија десетици
ако не и стотици други библиотеки
да ги правите нештата подобро или поинаку.
Значи, ајде да ги разгледаме во како оваа библиотека работи.
Значи, повеќето од овој код е идентични за миг.
Имам пат се создадени до врвот.
И сега јас го повикувам async.series.
Па async библиотека, тоа е само една библиотека која ти овозможува
да помине или да се подигне обично на функции да се нарече еден
по друг само за да вид на избегне тоа вовлекување прашање,
и навистина само ментална вознемиреност што секогаш ќе се појават
барем кога за прв пат нурне во тоа на свој
со програмирање асинхроно.
Како и во настрана, ако сте ги направиле 161 и сте се занимаваа со катанци
и да се подигне услови и сите на тоа, асинхрони код
и животната средина, како node.js е, всушност, многу,
многу поедноставно веројатно
отколку всушност пишување многонишкови код.
Во секое време имате многонишкови код,
имате подигне услови.
Ќе мора да се грижите за две теми кои содржат
за исти ресурси диск или меморија.
Убавината на вклучите Javascript-
во node.js е има буквално само една нишка,
што значи дека пребарувачот
или на серверот може само направи една работа одеднаш.
Тоа е само до тебе, на програмерот
да ја задржат менталната модел за како можете вид на дното работи
и да дознаам како да го нарачате код.
Но никогаш не треба да се грижите за да се подигне услови
во прилично на истиот начин на барем со суровини кодот вака.
Значи, тоа е малку тешко да се grack тука.
Но - Значи, да ми се отвори на документи за само еден миг.
На async.js библиотека која Слично е многу googleable,
тоа живее во GitHub repot како многу од нив.
Не мислам дека тоа е површни, тоа не е.
Дозволете ми да дојдете долу на ме читаат тука.
Значи, async библиотека обезбедува бројни
методи во него.
На пример, има методот наречен секој,
кој ако јас кликнете на ова само да ја видиме нејзината документи за момент,
ова е функција или метод кој ви овозможува да се направи нешто
како по четири но во паралела.
Тие се сите нема да се случи потенцијално паралелно.
И начинот секој е само ќе се врати на вас кога сите
на повторувања се заврши.
Па можеби тие се случи едно по друго.
Идеално, тие се случи во суштина паралелно.
Но методот не ви се јавиме.
Тоа не зуи вашиот сирена се додека сите
од елементите што треба повтори во текот имаат завршено.
Значи, тоа е само убав начин
за избегнување на користење едноставен четиритактен циклус
но всушност прави нешто асинхроно.
Но сега се повеќе директно поврзани со овој пример,
забележите дека е ова серија метод.
И дозволете ми да се повлече до едноставна канонски пример.
Па async библиотеки, серија метод ги зема во што се подразбира
од квадратни загради во низа.
Кои се податоци видови на елементи
во оваа низа врз основа на едноставен пример?
Ова е низа на функции.
Па во C, што би го нарекол ги функционираат совети.
Во JavaScript, постојат повеќе правилно референци за функции
или анонимни функции.
И ова само значи, низи
се разбира се нареди од нула горе.
Значи, што се одржува наредба, што е добро
за серија, затоа серија Секако, ова значи да се направи нешто
со цел да не паралелно.
Значи, ова само значи дека овој функција ќе се извршуваат,
тогаш оваа, тогаш ова еден, и оваа, тогаш овој,
меѓутоа многу постојат
додека конечно изборен повратен се нарекува.
Значи, го забележуваат парадигма тука.
И иако ова е библиотека еден дечко,
тоа е претставник на многу честа вклучите Javascript-парадигма
на повторно користење callbacks.
Значи, се забележи она што го правите овде.
Во првата функција е донесен во преку оваа низа,
што е дефинирано анонимен функција само со функција.
Но известување дека очигледно според оваа документација,
дека анонимен функција треба да преземе аргумент повратен повик.
Што се случува да биде покажувач или врска со функција
што треба да се јавам кога вашиот кодот е подготвена да се врати на вредност.
Значи, повторно, за разлика од само обично процедуралните програмирање
каде сте навикнати да враќање вредности веднаш
дека една разлика со со користење на библиотеката вака
во асинхрон програмирање повеќе Општо земено, кога ќе бидете подготвени
да се врати на вредност од база на податоци, од датотека,
од аритметика израз, тоа е до вас
да се јавите на повратен повик функција.
И убаво нешто за оваа библиотека
ако ги читаме документи повеќе внимателно е дека,
ако и само ако сите на callbacks областа наречена
без грешка објект, ќе целата работа успее?
Значи со други зборови, ако постојат 2,
ако има 10 анонимни функции
во оваа низа затоа во оваа серија,
само ако сите од нив се успее,
ќе финалето опционални повратен повик се смета за успешна?
Ако некој од нив не успее, секоја функција
по тоа нема дури и да биде погубен.
Значи, тоа е убав начин на сортирање на се има паричка синџир
дека прекинува предвреме ако нешто тргне наопаку.
Така да се види тоа во контекст, тука е како да се ре-имплементираат
дека претходната програма.
Јас се добие пат како и досега, па ова е полесниот дел.
Јас копирање и поставување овој скелет код
од документацијата има async.series отворен заграда,
отвори квадратни заграда.
И сега забележите Имам еден функција во овој почетокот
од секунда, ќе видиме каде одиме од ова.
И сега се забележи, тоа е малку комплекс во прв
но се фокусираат само на тоа линија по линија.
Fs.stat значи добиете статистика или она што не на тој пат.
Ова го нарекуваат повратен повик кога сте подготвени.
Овој код е исто како порано.
Ако има грешка, има една разлика сега.
Повторно, многу честа појава парадигма во node.js програмирање е
ако нешто тргне наопаку и повратен повик треба да знае
дека со Конвенцијата, првиот аргумент за повратен повик ќе
дека нема, ако се е во ред или упатување на Грешка објект,
капитал Д Тоа е како Грешка класа кои постојат на глобално ниво
но повеќе за тоа некое друго време.
Па со тоа, ако има грешка, што е импликација?
И врз основа на она што изјави серија прави тоа,
е ако нешто тргне во ред, ние само вид на сакаат
да се откаже од целата серија на анонимни функциски повици.
Значи, тоа е доволен за мене да само се вратат повратен повик донесувањето
во грешка објект.
Бидејќи ако запишам даде ме назад грешка,
Јас би можеле да се создаде нов Грешка објект на моето,
но јас навистина не се грижат за,
Јас само сакам да го поминат без оглед на грешка е што всушност се случи
за да можам да го помине на овој повратен повик.
И само за да бидат јасни, враќањето не е неопходно.
Јас во суштина сакате да го направите ова но јас сакав сега се "врати;
/ /, Така што нема повеќе код овде извршува ".
Значи, повторно уште еден заеднички конвенција во JavaScript,
дури и ако не сте враќање вредност сама по себе,
дека сакате да го помине на вредноста на повратен повик функција
но, тогаш ќе сакате да се запре извршувањето
на функцијата сте во, тривијален начин
да го направите ова е само да се јавите врати тука.
Но нема ништо лошо,
ние сме само прави враќање повратен повик грешка, дури и покрај тоа што се случува
да се вратат во недефиниран вредност.
Добро, тоа не го прави се врати на вредност, најверојатно.
Сè што ми е гајле за е интернат натамошното извршување.
Значи, мојот conflation на овие две линии е само стилист
кон Конвенцијата само за да имаат број на линија
на кодот Јас само напишав од 2 на 1.
Па што друго?
Ако нема грешка -
всушност, да биде јасно Јас, исто така може да се избегне
дека со тоа ако на друго место.
Но, повторно, уште една заеднички парадигма е проверка
за вашите грешки до врвот и потоа само се вратат, отколку да продолжи
да вовлекувате вашиот код со elses и elses и elses.
Значи, ако тоа не е датотека, сега, знаеш,
Сакам да се справи со ова малку посебно.
Значи тука како и во Јава или C + + или неколку други јазици,
тука е како да показ објект да напишеш грешка донесувањето
во стандардниот порака на не е датотека
и ова е само донекаде произволна.
Но јас сум сигнализација грешка на мојот сопствен.
И она што го прави ова последното линија веројатно значи?
Сите е добро.
Ако помине во null за грешка параметар, кој само значи
од конвенцијата се е во ред.
Значи, тоа значи дека она што ќе се случи логично?
Ако нула е донесен на повратен повик
тоа значи дека овој анонимен функција го наследи
така да се каже.
Значи, она што треба да серијата метод претходи и сега се заснова
на мојот вербална дефиниција порано?
[Беззвучен Забелешка]
Да се ​​движи кон следниот, нели?
Ако се врати не-нулти вредност, тоа само ќе се прекине
и има повеќе анонимни функција ќе се нарекува.
Но, бидејќи тоа не е, тогаш ова ќе се вика следната.
Значи, логиката тука е прилично многу исти како порано
и ќе видиме како да се чисти ова горе понатаму во еден момент.
Сфаќам ова е вид на многу
да ги апсорбира сите вербално и визуелно.
Но сега се забележи, вториот анонимен функција што сакам
да се изврши во серија е да се обиде да ја прочита датотеката.
Ова го нарекуваат повратен повик кога ќе завршиш.
Ако има грешка, само сигнал тоа по пат на повратен повик
така што остатокот од овој материјал прекинува.
Друг се врати NULL.
Но, зошто сум јас поминува во два аргументи?
И ова време, ако јас ги прочитав на датотеката и да се вратат
како променлива наречена податоци,
Сакам да не само да значи се е во ред со враќање нула
за првиот аргумент.
Сакам да се врати на вистинските податоци како втор аргумент.
Бидејќи ако јас чита понатаму во документацијата,
забележите овој последен парче од код квадратни заградата значи дека е
крајот на серијата.
Имаше само два анонимни функции во оваа серија.
Ако имало грешка тука, тогаш Знам дека еден од линковите
во овој синџир, па да зборува не успеа.
Значи со други зборови, оваа грешка се случува да биде грешка објект
дека е нула ако ниту од овие момци не успеа.
И ако тоа е случај, јас сум само ќе кауција од и јас одам
да се каже 400 кој значи барање да не успее,
тоа е многу генерички порака за грешка.
И тогаш, јас ќе одам да печатење на порака за грешка.
Значи, јас не сум пречеше да биде супер анален ова време,
Јас не одам да се направи разлика помеѓу 500 и 404 и 403,
Јас сум само вид на слепо бран мојата рака
и да каже нешто тргнало наопаку.
Но ако ништо не тргне наопаку,
Одам да ја пратите оваа res.end поминува овие податоци.
Сега ова изгледа малку криптичната.
Но, повторно, ако јас ги прочитав документацијата,
на вториот аргумент на оваа последна, финална повратен повик,
човек што е само егзекутирани еднаш серијата е направено
извршување или дел има на, ова ќе биде низа
на сите вториот аргументи
дека беа донесени на повратен.
Сега, излегува дека само линк во оваа серија
кои, всушност, се врати на втората аргумент е овој овде.
Па ќе одам да се најде на на скок на верата едноставно користење претпоставиме
за момент дека последниот е метод
кој ви дава последната елементи на низа.
Бидејќи оваа низа тоа е се помина
да ме има две индекси, нула и еден.
Тоа е само нула нема вредност бидејќи овој човек се враќа -
не помине во втор аргумент, но овој човек го прави тоа.
Па резултатите заграда нула е ништо,
резултати заградата еден го содржи она што,
ако сте биле следниве заедно до овој момент?
Датотеката, здраво, свет содржина веројатно,
па тоа е како јас всушност печати неа.
И дозволете ми да завршам еден детаљ тука.
Ако го направам овој вид на стари училиште, ако сакам да се добие
во последен елементи, ако можев направи резултати [results.length-1],
тоа е вид на старата школа начин
на пристап до последните елементи во - или нула индекс низа.
Но, како што во страна, се потсетиме што ја имам таа библиотека
тука црта која со Конвенцијата е само се нарекува
буквално црта карактер кој не е посебен,
тоа само изгледа кул како знакот за долар го прави за jQuery.
Ова е само еден помошник метод истакне точка последните
кои го прави токму истото.
И ако никогаш не сте го користеле пред истакне ЈС двете
за клиентската страна, кодирање
и серверот е прекрасно корисни библиотека
дека како многу луѓе што е опишано им се допаѓа jQuery ги содржи сите
на методите, луѓето сакаа дојде со вклучите Javascript-себе.
OK.
>> Значи, како убаво да се мене и Гледав во серијата,
имате како повратен повик како аргумент?
>> Да.
>> Како и вас, кога всушност како притисни дека во,
и како што тоа го прави значи кога вие само треба
како повратен повик, а потоа направи како -
[Беззвучен Забелешка]
>> Добро, добро прашање.
Значи, дозволете ми да се повлечат до async главната страница тука
или документација за GetHub.
Значи ова е канонски структура.
Ако сте повик со користење на овој одреден метод серија,
има две големи делови на него.
Една од нив е низа на анонимни функции
и двете е конечна повратен повик функција која е всушност
извршена на самиот крајот на серијата.
Сега, ако ние зумирате во малку поблиску на првиот
од оние големи нешта, низа на анонимни функции
од барање на оваа документација човек има
да се биде анонимен функција која ги зема
во еден аргумент наречен повратен повик или foo или бар, тоа не е важно
а тој не ја повикува повратен повик.
И ова е вид на вашиот сирена дека подаваат колиба можете раце.
Ова е средство со кое можете да се врати на вредност
на купувачи затоа што не може само да буквално се вратат.
Што треба да го направи тоа со начин на овој повратен повик.
Бидејќи ако внатрешноста на оваа функција е некои бавно крената
код како пребарување базата на податоци, да се прочита на датотеката од датотечниот систем,
не сакате да чекате таму и да го блокира секој друг,
сакате да се јавите на повратен повик.
Значи, ова е буквално името на аргументот.
Но, како и во C, можете имаат функција покажувачи.
Во Јава имате референтен систем методи
и исто тука во JavaScript.
Ова е променлива, но ваков тип е функција.
Па едноставно со пишување нејзиното име дали повратен повик или foo
или бар, потоа отворете го загради и блиску заграда,
ти си ја врши таа на таа функција.
И донесување на нула кои значи нула грешка и еден
што значи ова е податоци што сакам да помине внатре
А потоа парче да бидат јасни, ова е уште еден повратен повик.
И тоа не се вика повратен повик,
тоа само концептуално е повратен повик метод функција
затоа што тоа се нарекува по дефиниција
на библиотеката на овој автор, кога целата серија има завршено
или подмножество од него ако грешка се случила порано.
Значи, името на повратен повик функција, повикувајќи повратен повик функција,
името на повратен повик функција, повикувајќи повратен повик функција,
различни повратен повик функционираат сите заедно.
>> Сега имаме како дефинираат повратен повик?
>> Не, бидејќи овој човек ќе помине во вашиот низа
на анонимни функции,
покажувач на кодот тој сака да се изврши.
Точно, во ред.
Значи, ве молиме да се каже дека кодот добива малку поедноставно.
Значи, тоа може.
И ако сте како мене, да ги преземе удобност во најмалку знаејќи,
тоа трае додека да се се навикнеш на тоа.
Но, ние може да се чисти ова горе малку,
не да се фрли премногу во да ви но тука е уште еден варијации
и користење на друг начин
во истата библиотека наречен водопад.
Главата на која е за разлика од серијата, каде што секоја
на оние анонимни функции егзекутирани во суштина
независно еден од секоја од другите.
Водопад како што самото име сугерира им овозможува на највисоките функции
да се вид на помине во вредности на пониска функција,
Вид како каскада од вода.
Па Главата на овој е што можам да вид
на користење на тоа да ми предност.
Во async.waterfall, забележиме следниве.
Јас само може да се јавите fs.stat поминува во патот
што сакам да го добие статистички податоци за.
И тогаш се сеќавам пред да имаше анонимен функција
кој имаше два аргументи згрешат,
esults а потоа се јавив на повратен повик функција рачно?
Со други зборови е само за да бидат јасно, се потсетиме дека на почетокот
во async 2, јас не сите на овој гаден работа.
Се јавив fs.stat помина во P,
прогласена моето анонимни функција.
Јас тогаш проверува дали грешката е не нула, тогаш го сторив тоа,
друго што го направив тоа, целата Убавината на следниве конвенции
како и во node.js е дека повратен повик функции во целина се наменети
да преземе најмалку еден аргумент, на Грешка објект проследено со нула
или повеќе корисно вредности.
Така забележите парадигма тука,
овој повратен повик функција јас сум прогласување на следниов начин точно
парадигма дека овој човек е async библиотека го прави тоа.
Што да се каже ова, зошто сум Јас спроведување моето повратен повик
метод кога авторот на овој библиотеката е буквално ме предавање
на послужавник така да се каже, на повратен повик функција можам да користам?
Значи, јас само може да помине во референтни тој ми даде
така што веднаш, мојата неколку линии
на кодот да стане една линија код.
Сега, каде да одиме со ова?
Следните функција која Сакам да се изврши,
следниот анонимни функција во оваа низа
на функции го прави следново.
Известување прв запишам е првиот аргумент.
Па нешто мора промени веќе.
Сега, овој човек, кој напиша библиотека -
и сакам да кажам дека човек затоа што тоа е еден дечко.
Овој човек кој го напиша оваа библиотека е документација гаранции
дека ако оваа функција тука мене поминува назад на Грешка објект
или нула проследено со кома Листа разделена на други вредности,
тој ќе бидете сигурни дека оние други вредности се предаде
до овој анонимен функција со цел од лево кон десно.
И она што се користи да биде само повратен повик функција сам едноставно
станува последен аргумент.
Сега, јас не знам кој сум фокусирање на само знаеш.
Но сега, она што е земе овде?
Значи, знаеме од документацијата
или пред неколку примери
дека fs.stat на крајот очекува повратен повик со два аргументи,
Грешка објект кој е Грешка објект или нула проследено
со упатување на статистика објект.
Значи, ако јас се размислува за тоа, Грешка објект кома статистика објект,
која се вклопува во парадигмата на библиотеката оваа личност.
Значи, јас едноставно може да се каже, бидејќи Јас нема вториот аргумент
дека тоа е - што се случува да биде усвоен од страна на fs.stat
на повратен повик е згрешат, статистика по дефиниција на оваа библиотека,
Јас да се стави на втор име аргумент тука
или што можам да го преименувате
ако сакам проследено од страна на повратен повик тука.
Значи, јас може да помине една вредност од тука до тука.
Сега, сите на овој код иако очигледно малку криптичната е
барем копија паста за најголем дел од порано.
Единствената разлика е во најава тука сум прогласување на Грешка
објект и сега сакам да се добие малку познавач.
Јас всушност сакате да знаете што грешката е, па ќе одам
да навивам внатрешноста на овој објект е сопственост произволно наречен код
така што знам дека ова не е датотека
кои треба да бидат неовластено, тоа е HTTP 403.
Дозволете ми да се запамети дека пред Јас го помине Грешка објектот
на повратен.
А потоа на крај пробајте да го прочитате датотека, па во овој случај,
водопадот, јас сум скршена го кодот од два големи чекори
на три помали чекори.
Обрнете внимание на убавината тука,
Јас може да се јавите fs.readFile поминува во патот.
А потоа на хард дел ментално, е јас само го положат
во возвраќање на Гај.
Она што ме предавање, јас сум ќе се пренесат и на fs.readFile.
Бидејќи сите ние сме се почитуваат на истиот конвенции,
Првиот аргумент за повратен повик е на Грешка објект или нула проследено
од кома или разделени листа на корисни работи.
Значи, она што значи тоа сега и ако јас прочитајте ја документацијата ќе знам
ова, последен повратен повик, овој човек тука надвор
на квадратни загради се случува да биде усвоен во грешка објект
или нула што јас треба да проверува за како и секогаш со овој код овде.
И тогаш по дефиниција на овој метод
во документацијата момчето, последната вредност се врати
од последната метод во мојот анонимни низа -
мојата низа на анонимни функции.
Значи, она што ја прочитам датотеката враќање
и јас сум со користење на враќање лабаво сега.
Мислам, она што не чита датотека помине како аргументи
на повратен повик метод нејзините раце?
Два аргументи, првиот е на Грешка објект или нула,
тоа е речиси секогаш ќе биде одговорот.
А втората работа ќе да биде она што за читање датотека?
Содржината на датотеката, податоци, како што го нарече порано.
Значи, со едноставно прогласување згрешат, резултат,
и да се провери за грешки ова е вид на здодевни сега.
Друго, јас не res.end поминува во таа резултат.
Ова несомнено ќе не ги синхронизирате во совршено
додека пак всушност напишете го сами.
Но, за сега, се намалува во најмала рака фактот
дека постои очигледно ова заеднички парадигма, при што ако ние
и авторите на библиотеките сите вид на стап
со оваа конвенција на повратен повик методи.
И првиот аргумент е на Грешка објект или нула.
И втората и третата
и четвртата објекти се работи ние се грижиме за и ние вид
на следат правилата и документација.
Почнавме со код кој искрено е прилично грда.
И иако најновите Пример за ова е искрено вид на тешко
да заврши вашиот ум околу, тоа е барем визуелно,
изгледа како тоа е многу построги.
И штом еднаш ќе се чувствуваме удобно со него, тоа е многу полесно
и тоа е толку многу помалку склони кон грешки отколку што претходниот пример.
Значи, дозволете ми да покажат Едно последно нешто тука.
Ова е верзија три.
И - Не, ајде да го оставиме ова сам.
Дозволете ми да одат во неколку други последните работи како закачки.
Добро, па во серверот 2.
OK. Прво, било какви прашања, Знам дека ова е многу
но си сакал повеќе инструкции, така?
Вие не кажа добар настава е задолжително.
Да?
[Беззвучен Забелешка]
Точно, ти си во суштина благи до оперативниот систем
да дознаам како да жонглирам сите овие топки одеднаш,
читање од датотека, читање од базата на податоци.
И тоа е тоа вклучите серверот себе дека е една навој.
И суштински, а всушност,
има една слика Јас не фрли,
и тоа не е нужно сите што просветителската
но можеби ќе даде можете ментална модел.
Го вклучите Javascript-себе и јазол
особено има ова т.н. циклус на настани.
При што, што може да мислам на node.js, програмата,
е буквално како бесконечна јамка.
Тоа е само диви јамка, чекајќи и чекање и чекање,
во потрага по задачи да се заврши.
И задачата може да се, одете пренесам нешто од базата на податоци
или тука е вредност од база на податоци или одам да купам оваа датотека
од дискот или тука е да побара од корисникот.
Било кој вид на настан, исто како и на пребарувачи настан управувано,
така што серверот страна настан управувано.
И сите оние нешта сочинуваат настани.
Значи некој во node.js, само напиша бескрајна јамка,
голема дива јамка, чекајќи за работи да се случи.
И како работи не се случи, тоа завршува во ред, нели?
Секако, база на податоци може да се врати на вредност.
И фајл системот, оперативниот систем може да се врати на вредност
приближно во исто време но има веројатно ќе
да бидат некои нарачување на нив.
И node.js се случува да се имаат суштина задача
како голема низа или вектор, некои податоци структура
дека амортизери сите од тие нешта.
Бидејќи тоа може буквално само се справи со еден од нив во исто време.
Значи, кога ќе, на инвеститорот,
пишување асинхрони го вклучите Javascript- кодот користејќи асинхрон
функција, си дозволив ова т.н. настан јамка за да одат
на следната функционирам, нели?
Значи, колку што ќе веднаш се врати како сите
на овие асинхрони методи ми се допаѓа читање на датотеки и запишам,
ќе се вратат веднаш бидејќи повратен повик на крајот
се врати.
Веднаш штом ќе се вратат,
тоа значи дека некој друг може да се појави надвор од акциите на тука
или дека тоа може да се појави надвор во предниот дел на дното тука.
И така, постои во Всушност продолженија
на сето она што се случува,
иако сите овие нешта може да се случува во паралела
на нишки систем.
Но себе и node.js серверот се извршува
како една нишка.
И одредување на страна на тоа е т Вие не секогаш макс
од вашиот компјутер способност е особено
ако имате 16 основни или дури и 2 основни компјутерски
а ти си само трчање еден пример на јазол.
Но, ако сте повторно преземат нешто како 161,
да се избегне голем кошмар главоболки кога станува збор
да се трка условите и брави и семафор
и пишување навистина многонишкови код,
па квит сум и downsides.
OK. Значи, назад кон код овде, дозволете ми да предложи дека ние почнуваме
да се поедностави работите малку.
Видовме сервер еден малку пред која изгледаше вака.
Значи, тоа е веројатно прилично едноставна.
Но, исто како во светот на PHP, постојат рамки
како Laravel и има работи како Rails и Џанго,
истото во node.js светот.
И ние ќе трошат повеќе време на овој средата
и во следниот проект.
Но, ако одам во сервер 2 директориум,
забележите неколку парадигми тука.
Значи ова е - таму ќе да биде еквивалент пример
но тоа е со користење на рамка наречена express.js,
кој е бесплатен софтвер со отворен код софтвер како Rails и Џанго,
како Laravel, тоа е само во крајна линија ќе
да се биде ценет денес Зашто ние сме биле пишување
толку едноставни примери.
Но верувајте нас.
Ова ќе многу брзо да стане ваш пријател
затоа што тоа ќе ја спаси можете многу од TDS код.
И заедничка парадигма за на express.js апликација е
да имаат app.js или server.js датотека која содржи логиката
на вашата програма или најмалку влезна точка.
Можете да имаат повеќе датотеки.
А јазол модул поддиректориум кој има библиотека
дека сте ја преземале како async
и се изрази во другите.
А потоа package.json, package.json изгледа вака,
и можете да го создадете рачно или алатки се создаде за вас
и тоа е буквално JSON датотека
и интересниот дел е зависности тука.
Исто како и во Laravel, можете имаше дека продавачот директориум
а ти мораше да се грижи за пакети и прави -
всушност ажурирање со Занатски или слични команди,
библиотеките ќе имате инсталирано,
Слично со package.json тука и да управуваат со библиотеките
и верзија дека се грижите за него.
Значи, ако имам package.json, Јас едноставно да го направите НПМ,
Јазол пакет директор инсталирате, тоа се случува автоматски да се погледне
во тоа package.json датотека.
Погледнеше, можам да имате најновата верзија
на сите продавачи модули
во јазол истакне модули Директориум тука или можеби
во некои родител или предок директориум.
А ако не, тоа е ќе ги преземете
и ќе видите целиот куп
на HTTP работи ќе преку жица.
Така на пример, дозволете ми ви го покаже содржината
на јазол модули само да го искажам.
Дозволете ми да оди напред и да смело избришете јазол модули
така што сите што имаме сега е тоа.
И ако јас не НПМ инсталирате, да ќе види дека тоа се случува да се прочита
дека package.json датотека и видовме излез слично
со ова во светот Laravel.
Тоа е симнување на целата куп на работи и тоа е
бидејќи Express за возврат зависи целиот куп
на другите народи библиотеки.
Значи, сите оние кои се еден вид на се симнува рекурзивно.
До сега, ако го направам во ЛС, повторно,
таму е мојата јазол модули Директориум назад
и да ги изразат како се назад.
Па тоа е само начин на поедноставување на управување со пакет.
Сега, ако се погледне на app.js датотека, ова ќе
да биде враќање на нашите најрани веб сервер
каде што ние едноставно плукаат надвор "Здраво, свет".
Но коментар на парадигми тука,
Првиот бараме изрична модул, тогаш имаме оваа линија
од код кој знаете од документацијата.
Вие буквално лекување на тоа променлива модул како функција,
толку отворен заграда затвори заграда значи изврши го.
Тоа ќе очигледно се врати нешто што ние ќе
генерално се јавите на стан.
Како тоа функционира?
Јас навистина не знам.
Јас ќе те оставам некој друг, знаеш, во Експрес светот напише тоа.
Одам сега да застане на неговото или нејзиното рамо, па како
да се направи моето барање работи малку поедноставно.
Еве, јас ќе одам да се слуша на тој конкретен порта
кои можат да бидат повеќето ништо.
И тука е код кој е можеби и повеќе потсетува сега
на Laravel и routes.php.
Значи ова е едноставна вечера, јас сум само ќе се определи пат
за коса црта ѕвезда, па сè се случува да бидат апсорбирани
од ова барање управувачот.
Парадигмата за барање управувачот е неговата анонимен функција
со барање аргументот
и одговор објект исто како и порано.
И res.send во експресен начин ви испратиме код проследено
од она што сакате да ја пратите.
И, се разбира, може да се направи нешто познавач
со всушност испраќање додадени фајлови: или HTML
или динамички генерирани содржина.
Но, за сега, сите ние го сторивме беше плукаат Здраво, свет.
Ако одиме во серверот три, ова е дури и познавач само
да ви покажеме некои функционалност.
А ние ќе ви покажеме на дури и sexier верзија
на овој во средата.
Но ако некогаш сте слушнале на Грло IO можеби,
така како што мислам дека Џонатан или некој рече порано,
една од работите јазол е навистина познати
за е нејзиното вистинско време однесување, нели?
Размисли за PHP во MySQL, ако требаше да се спроведе разговор сервер
во PHP при што две лица може да отвори прозорец на прелистувачот да foo.com
а потоа започнете IMing секоја други, Алиса во земјата на еден прозорец,
Боб во друг, така што секој од нив ја гледа својата
или нејзината пораки во другиот прозорец.
Како ќе го направите тоа во PHP и MySQL?
Користење или некористење Laravel вид на нематеријални, може да имаат
како index.php датотеката.
И ќе морате да имаат - во некои случаи тоа е мора да плукаат
вон форма, така што ќе биде форма HTML
кои најверојатно не ги доставува преку нормална форма поднесување
но Ајакс веројатно, нели?
Значи, за да поднесе управувачот, па вие тип во полето за текст,
ќе притиснете ентер, а потоа го добива испраќаат до серверот преку Ајакс.
Што прават тогаш направи на серверот?
Значи, имаш index.php
или нешто точка PHP дека е добиени во HTTP параметар
од страна на корисникот, Алис или Боб инстант порака, она што го правиш
со тоа, со цел да го пропагира на Боб или Алис, соодветно?
Јас ви значи буквално имаат алатки со кои
да го направите ова во вашиот мин.
Значи како што ќе направиш?
Имате една минута да се спроведување на оваа програма.
Да?
[Беззвучен Забелешка]
Совршена. Право, па имаш базата на податоци.
Ние знаеме малку малку за MySQL.
Значи, вие треба маса тоа е пораки,
можеби има време Каталог на поштански марки, корисничко име,
на телото на пораката се создаде тоа,
ажурирани дека и сето тоа.
Значи, вие ги чувате во база на податоци.
И претпоставувам Алис испраќа Првата порака, како не Боб добие
дека пораката сега од базата на податоци?
>> Тоа би можело да биде некој Ајакс одговор дека постојано се случува
назад кон базата на податоци врвот добиете [нечујни].
>> Токму така.
Така Боб код кој е кодот е исто како Алис е само вид
на симетричен однос,
Прелистувач Боб има некои Ајакс код тоа е веројатно можеби на секои 30
секунди влече сервер преку Ајакс синхронизација,
постојат нови пораки?
Дали постојат нови пораки?
На секои 30 секунди се случува да биде вид на неоптимална
затоа што тој има да чекате уште
ако Алис буквално само што ја испратил пораката.
Значи, пребарувач Боб би можеле да секој втор хит серверот.
Но тоа значи дека на Alice пребарувач е притискање на серверот
секоја секунда.
Што е со Чарли [Претпоставува правопис]
и Дејвид [претпоставува правопис] и Едвард [претпоставува правопис]
и секоја друга писмо од азбуката?
Што е проблемот на овој пристап?
А многу хитови прекумерна -
Мислам дека си само ефикасно Дозирање свој поглед
или DDOSing, Дистрибутер Denial of service напади
на вашиот сопствен сајт, со тоа што сите
на овие корисници се кандидира вклучите Javascript- код кој е само pinging на
подлец од вашиот сервер дури и ако произволен број,
80 проценти од времето никој не рече ништо
во собата за разговор.
Но ти си само проверка да бидете сигурни дека на таквите.
Па PHP во многу јазици се само не е добро
за реално време комуникации.
Бидејќи во PHP потсетиме има нема централна меморија, нели?
Имате сесија објекти кој создава илузија
на централната складирање, но тоа е на секој корисник основа.
Немате глобалната меморија како да се направи во Java Servlet
во познати или во други рамка работи како што.
Node.js иако, вие не мора глобалната меморија зашто имате
еден сервер и тоа може да сеќаваш на ништо што сака
за сите корисници.
И можеби уште имаат база на податоци.
Но убаво нешто за node.js премногу е дека тоа е многу подобро
отколку нешто како PHP и создавање на илузија
за ракување со повеќе работи одеднаш.
И во фактот што во настрана, можете да спроведување разговор сервери во PHP,
но обично не би го направил нешто што се нарекува долго избирачки
при што не ви се пинг серверот секоја секунда.
Ќе се поврзете на серверот, сервер не одговори за вас
за нагоре од 30 секунди, таа буквално седи
во јамка на чекање и чекање.
И серверот проверува дали има нови податоци во базата на податоци
и само еднаш го гледа, "О, тука е пораката од Боб, "
не го одговори на HTP сервер?
Па ефектот во вашиот интернет пребарувач е дека IE икона или Mozilla
или што и само чува се врти 30 секунди во исто време.
Но главата е, вие не имате 30 барања за конекција
30 секунди, го имаш.
Така се вика долго избирачки.
Но, дури и подобро во модерни веб прелистувачи е нешто што се нарекува
WebSocket, кои имате CS143,
ќе можат ефикасно да се направи TCP конекција од клиенти
како прелистувач за серверот а потоа да се откажам од неа
без користење на речиси како многу ресурси
како HTTP традиционално би можело да се направи.
И Socket IO е на node.js библиотека
што го прави многу полесно да се направи сокет врски
или илузии таму на за стари прелистувачи
така што ќе може да се спроведе овој реално време функционалност е.
Значи, тука е еден пример.
Овој материјал до врвот, добива малку повеќе комплицирано
но тоа е главно копирате и залепите од документацијата socket.io е.
Еве сега повеќе прецизни барање управувачот.
Ако корисникот барање на коса црта, она датотека одам
да биде очигледно сервираат за нив?
Index.html.
И има некои нови работи тука поток
кој ќе ви покажам во само еден миг.
Но, ова е само уште еден начин
на грабање датотека на малку поефикасно
од само прави fs.readFile.
Тоа е малку попаметни особено за големи датотеки.
Значи скратам приказната, овие линии само за да им служи на
до фајл наречен index.html
која за сега да се претпостави содржи HTML форма со кое Алис
и Боб може да сношавам.
И на крај, io.sockets.on, така што ова доаѓа од оваа линија до тука.
Значи, јас сум само читање на документација io.socket ми дава
пристап до т.н. WebSocket со прелистувачот,
помеѓу прелистувачот и на серверот.
Слушам за посебни Настанот врска што значи
кога корисникот првата хитови на серверот се обидува
да ја отворите оваа врска, јас сум ќе се јавам овој повик назад.
И сега, јас ќе одам да го направите следново.
На секои пет секунди, она што јас ќе одам да направите?
Одам да се емитуваат или емитува ако се сеќавате нула,
графички јазик би дека емитува блокови?
Значи, сте ќе треба да се емитуваат
или да предизвика настан кој се вика произволно од серверот.
И тоа се случува да содржат пинг порака
и тековниот датум.
Значи, ова е вистински разговор сервер Алис
и Боб може да ги користат, но тоа е еден вид на автоматизиран разговор сервер
каде пораки се само вид на хидролокатор pings.
Тоа е само дружете на моменти, кои се да бидат испратени на секои пет секунди.
Значи, ако јас всушност ја извршите оваа работа - и тоа е тоа.
Да биде јасно тука долу, известување ова е само влезете овде долу.
Значи, дозволете ми да го претворам слепи на тоа.
Дозволете ми да го направи јазол на app.js.
Дозволете ми да одат на мојот интернет пребарувач.
Вчитај почетната страница тука.
[Пауза]
И дозволете ми да го затвори инспектор.
На секои пет секунди, имам демонстрација иако не
интерактивни за човекови
на нешто што е случува асинхроно.
Во прелистувачот огласот за доделување на, нема врти икона.
Тоа е со користење на познавач функција на Chrome во современи прелистувачи
за одржување на приклучокот врска под хауба
и тоа е она што се нарекува Општо земено паб / суб модел,
објавуваат / претплатите модел, каде не сме го направиле
дека доста експлицитно тука.
Но она што е убаво за оваа општи паб / суб парадигма е
дека можете да имате еден издавач.
Во овој случај централен сервер и сите
на поединецот прелистувачи се клиенти.
Alices и Bobs на свет може да се претплатите на неа,
па можете да реле пораки меѓу кој било број на корисници.
И иако повторно сме не гледајќи интерактивност,
имавме можеби 12 линии на кодот само за да го направите тоа.
И тоа е веројатно не е скок да се замисли како може да камшик
надвор од index.html фајл кој има вистински HTML форма,
малку на jQuery код со Ајакс, кој не испрати дневната
но само ги праќа без оглед на Алис или Боб тип на сервер
и потоа на серверот ќе ја препраќаш надвор.
И јас ветувам дека ќе видат на едно последно нешто само
да душманке ти со ова.
Ако одиме во поток нула и еден,
ќе видите код кој е само малку различен тука.
Само така си го видел, ова е алтернативен
на она што се нарекува fs.readFile метод порано, при што,
можете да кажете node.js: "Оди прочитајте го овој фајл во меморијата.
Но, ако тоа е голем само им даде мене парче во исто време. "
И можеби знаете од CS165
или 161 на датотечни системи имаат различни
перформанси својства.
Можеби ќе сакате да го прочитате во блокови од 512 бајти
или 2 килобајти или whatever.
Ова е оптимизирате начин на добивање назад на датотека iteratively
така што ќе може да го плукаат само малку побрзо
на пребарувачот или да кој на крајот клиент е.
Толку голема сума на содржината денес и ние ќе се нурне
во повеќе детали во средата со Tim [претпоставува правопис]
особено се гледа во тоа како ние може да го преведе некои од идеите
од првата половина на Се разбира Laravel и модели
во библиотека дека тој самиот напиша наречен Bookshelf.js
која е се повеќе и повеќе популарни во заедницата
бидејќи тоа ви дава поголемиот дел од него,
ако не повеќе од функционалноста на елоквентен
кој се потсетиме дека библиотека увид на Laravel,
па повеќе за тоа и повеќе како
да се развие во полноправно апликации во средата.
Ќе се видиме тогаш.