>> Добре.
Така че Катерачът е, какво е node.js както го познаваме днес?
Има ли нещо? Да?
>> Беше като рамка писмено JavaScript
приложения широк план -
>> Добре, че работи.
>> - Знам, че като общи цели, като -
или нещо може да направите, е като -
[Безшумен Забележка]
>> OK добро.
Да, така че това е рамка.
Това е двигател с която можете може да изпълнява JavaScript код
сървъра на сайта.
Това може да означава простият неща
като за написването на командния ред скрипт не в Python или Bash
или Ruby или PHP, но само в самата JavaScript
и изпълнение на мига командния ред.
Или всъщност можете да стартирате то в рамките на един уеб сървър.
И в действителност в рамките на node.js себе си,
тази рамка е цял куп на библиотеки, сред които са
в HTTP сървър, вграден.
Така че, всъщност можете да напишете на сървъра, както ще видим
само за миг, супер лесно от просто за разбиране малко
на HTTP и TCP и пристанища.
И вие можете да хвърлят хайвера си на слушане уеб сървър, без Apache,
без IIS на Microsoft.
Без никакви други инсталиран софтуер,
може просто да хвърлят хайвера си това и да слушате най-всяко пристанище
на системата, която ти е позволено да.
Така случай и точки, позволете ми да отида и да се отвори
до този пример, сървър-0.js.
Така се отбележи, че горната част на този файл, просто един куп
на безинтересни коментари, и след това има няколко
на представителните реда код че ще видим recurringly.
Така че, VAR HTTP получава изисква "HTTP".
Така че, вградени в node.js " инфраструктура е един куп
модули, които са наистина просто библиотеки и всичко се подреди
на име пространство с уникален идентификатор
като това е "HTTP".
Така че като в много езици като Java и C + +
и C, само себе си, когато импортирате или да включва
или в възел говори изисква модул прави своите бита.
И всичко това на паметта изисква получиш заредена
в RAM и следователно се използва.
Така че, вие нещо се зареди тази библиотеки или модули по поръчка.
Това означава, давай напред и да изиска
за тази програма на HTTP библиотеката
и се отнасят до тази библиотека от начин на променлива, наречена HTTP.
Но този символ лявата ръка може са били призовани нищо, Foo,
Бар, Баз, това няма значение.
Така че, за разлика от C + + и Java и C, където, когато имате нужда от
или внасят библиотека, тя просто сортиране
на става глобално достъпни,
node.js модули по-плътно пространство от имена.
Така че сами - тази функционалност е достъпна само в момента
по пътя на тази променлива име.
Не може просто да започнете методи машинописни че съществуват
в десния начин което вероятно е добра,
защото тогава си пространство от имена не получава почти толкова затрупана
както и в много езици.
Добре, така че сега като общ Предлагам, създаване на HTTP сървър
като Jonathan [предположи правопис] беше възможно е буквално
толкова просто като се обадите на създаде метод сървъра вътре
на HTTP модул.
Така че, това се връща позоваването
до някакъв вид уеб сървър.
Той дойде да Apache, не непременно като тежка категория.
Това обаче е малко по-лесно.
И сега, аз трябва просто да просто направите няколко неща.
Така че, на първо място, позволете ми да превъртите надолу към дъното тук
и прескачане на водача метод за миг.
И забележи този ред на код,
server.on който е по същество означава, сървър -
слушам като в Jquery код,
слушате за събитие наречен заявка
и просто да предположите какво трябва да направя
когато искане събитие пожари в сървъра.
Да?
>> Обадете се на функция манипулатор.
Така че, буквално се изпълни код, който е посочен
от тази променлива и всъщност не е променлива символ тук,
какъв е този символ предвид?
Е, това име на функционира тук
и манипулатор очевидно отнема два аргумента.
Защо две? Ами, ако просто прочетете никаква документация
за този модул, те ще бъдат уведомени, че водачът
която ще бъде използвана, ще бъде преминали най-малко два аргумента,
препратка към искането,
и вътрешната страна на запитването, буквално означава HTTP заявка.
Така че, всички тези, HTTP хедъри , които можете да извикате
от началото на семестър или някаква предварителна клас
или опит на подобни получите линия и приемащата линия
и User-Agent линия, всичко това е капсулиран и повече вътре
на тази молба обект.
И обект на отговор е сортирано за изходящи данни.
Така че, може да има позоваване на възрази, че няма да ти позволи
да се изпраща информация обратно към браузъра, като се обадите методи
По този последен аргумент нарича Res за отговор.
Но това може да се нарече Фу или Бар, това са само конвенции.
Така че сега, какво да правя?
Е, оказва се, че вътре на този супер прост уеб сървър
че аз съм за изпълнение, аз съм ще направя следното.
Отивам да напише HTTP заглавната част с код на състоянието 200,
200 смисъл OK, всичко е добре.
И след това, аз ще съм да премине на очевидно.
Какъв е типът на данните на вторият аргумент на полето главата?
>> Това е обект?
>> Това е обект с колко ключове и стойности?
Само един на всеки, нали, една ключова стойност на чифт.
Така че, "тип съдържание".
И единствената причина, Аз съм го цитирам тук е
защото тирето може да бъде вмества за знак минус
или нещо подобно.
Така че, аз трябва да го цитирам тук, опърляне или двойни кавички.
Но отново обща парадигма
в JavaScript код е често единични кавички тези дни,
дебелото черво и след това стойността.
Така че, това е само така наречения тип ум.
Това е хедър че буквално ще
да бъде тип съдържание тире на дебелото черво текст наклонена черта ясно, че става
да бъдат изпратени от сървъра към браузъра
така че браузърът знае дали да използвате това като Raw текст
или HTML или като изображение или клип
или флаш файл или нищо друго.
Сега, къде всъщност искам да изпрати в тялото на страницата?
Ами, просто чрез четене документацията
за обект на отговор във вътрешността на тази библиотека.
Виждам, че има правилен метод и че отнема низ,
може би и други неща, но минимално низ.
И низа е това, което е. изплюе към браузъра.
В този случай неговата супер проста, неговото здравей свят,
но тя може да бъде opne скоба, HTML, близо скоба,
отворена скоба на главата, близо скоба и така нататък,
това би могло да бъде Raw HTML.
Но ние сме запазване на примера просто само с плюене
от най-простите видове ум което е може би текст / обикновен.
И тогава просто response.end означава затваряне на връзката
и изпрати всичко, което имам сортиране на буферен вътре
на този обект обратно към браузъра.
Аз съм направил. Добре.
Така че, последното нещо, Правя тук
и това е малко произволно и трябваше да бъде хладно,
е, че казвам сървъра най-накрая да слушате
на определен TCP по подразбиране порт.
Спомнете си от началото на класа, че услугите -
или обикновено уникално го идентифицира с числа,
АД е в интернет, 443 е базиран HTTP уебсайтове, 22 е SSH, 21 е FTP
и 1337 е просто произволна но това е по-висока от 1024
което означава, че по-голямата системи, мога да го използват
без да е необходимо супер потребителски привилегии.
Така че това е просто удобен.
Но 8080 е в разстояние - обща една, 8088, наистина нещо голямо
в хилядите като обща но това е само още елит.
Добре, така че това, което се случва, когато аз всъщност стартирате тази?
Е, аз не просто да посетите страницата в браузъра.
Този файл се нарича сървър-0.js.
Защото отново, Apache е сега от картинката
за втората половина на курса.
Ако искам да Мрежата сървъра, имам нужда да пиша
и след това да изпълните този уеб сървър.
Но се оказва, че JavaScript както от страна на клиента
и сървъра страна е интерпретиран език.
Така че, всичко, което трябва, е преводач.
Така че, това е. - ако настоявате да тече възел и след това сървъра 0.js,
Аз може или не може да види някои от крайните продукти в зависимост
върху това, което библиотеки съм включена, нищо не изглежда да се случва.
Но нека да отидем на браузър и ме пусна
със същия IP адрес от моите CS50 клиенти.
Но това би могло просто както и да е моя Mac
или моя компютър и след това натиснете въведете.
Това всъщност изглежда като Apache.
Това е като директория Списък погледнахме
в в първата половина.
Така че, това, което съм направил погрешно?
Да.
[Безшумен Забележка]
Точно така, нали?
Така че, Apache е все още слушане на порт по подразбиране 80.
Въпреки, че мога да променя това, Можех да го изключите всички заедно
но тя все още работи.
Но тези момчета могат да Със сигурност съществуват заедно.
Аз просто трябва да сложите дебелото черво 1337 и след това може би
или може би не е най-наклонена черта края, за да получите достъп до този порт
че този сървър е стартиран на.
И сега виждам, че Здравей, свят се е върнал.
И аз може да удари презареждане като много пъти, както аз искам,
тя все още служи на една страница.
Всъщност, ако се отвори на Chrome инспектор, отидете на мрежа
и след това се презарежда цялата страница,
забележите, че всъщност това е искането е изпратено.
Ако аз гледам на Raw източник,
забележите моя браузър изпраща всички тези неща.
И тогава отговорът от сървъра е супер проста.
Там е 200.
Ако това не е твърде ниска на екрана,
има типа съдържание.
И тогава node.js вид на автоматично
за мен добавя датата и всички други неща
че браузъри обикновено очакват.
Така че, нека просто да видите Малко проверка здрав разум.
Нека се върнем на кода в сървъра 0.js и ме остави -
всеки път, когато отида в водачът,
Нека просто кажем, console.log.
("Имахме посетител!").
Нямам нужда да компилирате или нещо подобно,
това е интерпретиран език.
Така че сега, нека да се върнем към страницата, презареди един, два,
три пъти и отидете обратно към прозореца ми.
И сега виждам това.
Ами това е странно, Виждам шест линии.
Интересно уеб любопитни факти, защо Получавам шест искане не три?
Да?
[Безшумен Забележка]
Да. Така че, както може би знаете малко глупаво икона в горната
на лентата на браузъра, която много
на уебсайтове използва мощта бъде Harvard герб,
тя може да бъде фирмено лого или нещо подобно.
Така че, браузъри тези дни сортиране
на самонадеяно направи допълнително искане HTTP
на почти всеки уеб сайт, който посещаваните от вас проверка, ако има
по подразбиране файл наречен favicon.ico
в същата директория като файла, който се кандидатства.
И ако е така, той поставя иконата там.
Така че всичко, което виждаме е точно това.
И всъщност, нека да видим дали можем може да видите това, а не тип
разберете точно, "Имахме посетител".
Нека да вървим напред и изход.
И аз знам само това от погледнете в документацията.
Има един имот вътре в за искане на обект, наречен URL
което се случва, да бъде пътят
че е било поискано в действителната URL.
Така че, ако рестартирате сървъра просто като пуснете възел
на сървъра 0.js и Сега направете това един, два,
три и да се върнеш тук.
Ето го.
Slash е това, което I - исканата човека
в favicon.ico е какво браузърът е
самонадеяно желание за това.
Но не е точка толкова много неща Favicon
но как сървъра се управлява.
Да?
>> Защо има това да има някаква молба?
>> Защо има това - по характер на HTTP как работи.
Така че, HTTP може само да поиска един файл наведнъж.
Браузърите могат да бъдат умни тези дни
и да запази TCP връзка отворена.
Ако сте взели CS143 или като цяло запознати с работата в мрежа,
така че можете да получите повишаване на ефективността
чрез поддържане на мрежата сокет отворен
при вземането на множествена HTTP Разгледани Серийно над него
но те са един файл на заявка.
Така че, ако посетите нещо подобно -
Искам да кажа, ние можем да отидем да повечето уебсайтове.
Ако отидете - нека спра инспектор на Chrome е тук.
Тя може да се запълни най- на страницата.
Отидете в раздела мрежа и отидете на www.cnn.com.
И когато посещавате cnn.com, началната си страница -
браузъра си по-скоро отвратително прави - все още се брои.
OK. Най-малко 289 HTTP Разгледани отново и отново.
И това е причината, когато посещавате особено ояден уебсайтове,
те са бавно да се зареди защото на всички
на активите те зарежда.
Така че, тя изглежда като 298.
Може да има някои Ajax става в този момент, или някои
от активите са само ниско.
Така, всеки от тях е с индивидуална заявка връщане назад
и назад, напред и назад.
И затова по-рано, дори въпреки че ние някак говорихме
за това донякъде fancifully къде да поставите маркера на скрипта,
абсолютно прави разлика, когато имате -
тя започне да има много на трафика и много
файлове, които поискаха.
И всяка от това представлява вероятно изображение, на медиен файл,
файл с JavaScript, CSS файл или други подобни.
Така че, ние вече сме до някои 4 мегабайта просто
да погледнем днешните новини.
Добър въпрос.
Добре.
Така че, това, което са някои от на квит все пак?
Точно така, ние знаем как да се направи уеб страници, които вече са с PHP.
И много от вас дойде при класа знаейки Django
и Python или шини с Ruby.
Така че, защо имаме нужда от още един език и инфраструктура?
Какво е node.js особено добър, ако знаете?
[Pause]
Някои нещо?
Не? Да?
>> Пренасочване на съобщения.
>> Така че, препраща съобщения.
Така че това е вярно и това е вярно за повече техническа причина
и че node.js и наистина JavaScript е особено
добре подходящ за асинхронни код,
ако, чрез която можете да създадете илюзията
за правене на множествена неща наведнъж.
Така че, въпреки че те са наистина се случва серийно,
наистина в повечето случаи, JavaScript и двете от страна на клиента
и от страна на сървъра е единична резба.
Което, ако приемате 161 или дори 61 означава, че -
на тази програма, знаете,
преводачът може буквално само едно нещо наведнъж.
Но това не е чудесно за нещо като уеб сървър
където може да имате десетки или стотици или дори хиляди
на всички потребители, които се опитват за достъп до вашата уеб страница
по едно и също време.
И все пак, че предлагам обработването им един
след друга след на друга, особено ако някои
на тези, заявка, както видяхме на CNN може да изисква сервиране
до 300 файлове, преди да дори и да стигнем до следващото потребителя
който иска да види казва новина.
Node.js е по-подходящ за среди, като тази.
Защото това, което се случва, е всяко бавен процес тичане
като четене на файл от диск или справка с база данни или говорене
към друг мрежов сървър,
че е склонен да има латентност, нали?
Ако е взел 61 или 161 особено всички от този вид
периферни услуги са склонни да бъдат много по-бавно
отколкото да правиш нещо вътре в същата RAM и съща процесора
които казват в този случай сървър е действително работи.
Но това, което е хубаво за node.js е, че можете да -
и JavaScript в по-общ е, че можете да направите нещо
и след това да каже: "Хм, това се случва
да ми отнеме няколко милисекунди или дори за няколко секунди.
Нека сортиране на вилицата, че на разстояние " но това не е вярно процес.
И тогава, когато това е направено това че бавен процес тичане
като вземете редове от база данни или чете файл. HTML
от диск, то ще се върна при мен по-скоро
отколкото ми се налага да чакам за него.
Така че, за да направи това по-ясно.
Това е начин на моите извършване на тази по-запознати.
Добре, така че това е най- Разклатете Shack на площада.
Това е нещо като обща парадигма
за обясняване asynchronicity.
Това всъщност е добре Например, тъй като Shake Shack
и вкусни Burger са забележително забави за това, което правят.
Но въпросът е, че те са наистина добър в приема поръчки
и вземайки парите си след която ви чакам за вашата храна.
Така, това е действително по-добро дизайн от алтернативата.
Защото предполагам, че ходиш в магазин като този и имаш
до предната част на линията и направили поръчката си и искате
да бургер, както мога кажа, това отнема най-малко пет
или повече минути, за да всъщност става бургер.
Така че, би било вид на лош бизнес модел
ако докато чакате за вашия бургер, Alice [предположи правопис]
и Bob [предположи правопис] и Чарли [предположи правопис]
и всички останали са опашка зад теб
и вие сте буквално блокира линията на изчакване за вашата храна.
Така че, очевидно, най-Shake Shack
и други заведения за бързо хранене места, които не правят това,
те правят нещо подобно.
Те ще ви дадат зумер.
И те вид Ви изпратим на вашия начин.
И те ти се обадя от вземане на това малко нещо вибрира
или флаш да привлече вниманието ви.
Така че, това е буквално какво?
Нещо като node.js прави.
Ако node.js или JavaScript по принцип се използва
и на програмиста е достатъчно умен,
да се реализира, "Знаеш ли какво?
Каквото и да се наложи да направя така тук може да отнеме известно брой
милисекунди или секунди.
Знаеш ли какво?
Позволете ми да отида напред и да не го наричат ​​синхронно -
"Че е блокиране човек всички останали в ред, "-
позволете ми да отида напред и да вид отстъпи
и просто се обадя по-късно
когато това дълго бягане операция е пълна. "
И се обади разбира се се намеква в този случай
да функция за обратно извикване, а позоваване на патронник на код
която ще се изпълнява когато бургери е готов,
много прилича на това нещо има някаква вид функционалност вградена
че започва вибриращи или бръмчене, когато е време за вас
да се нарича обратно към предната част на линията.
Така че, това, което прави това значи в реални условия?
Е, ние трябва да ще се придвижваме напред.
Така че, нека да вървим напред и направи това първи.
В сървъра 1.js, нека ме първо опрости кода
така че можем да вземем бебешки стъпки към по-убедителна проблем.
Това е точно същото програма, която написах преди.
Но това, което е променило?
Там е нещо като леко синтактична разлика
между това и версия 0 преди малко.
Какво изпъква ти ако си спомняш?
Да Синтия [предположи правопис]?
[Безшумен Забележка]
Да. Така че сега, ние имаме една линия на функция да се прехвърлят инча
Ние сме се отървали от сорта
на безполезно име манипулатор функция.
Безполезна само с това, че преди дори го нарече на едно място,
Аз наистина не трябва да се губите време, като му даде име
и прави по-трудно да се прочетете горната код до долу.
Така че, нека просто да декларира инлайн е анонимна функция.
И аз правя две други неща.
Правя по-добре използване на точкова нотация.
Така че, както в Jquery, много възел методи могат да бъдат верига заедно.
Така че след като веднъж сте готови обадите нещо, че не е нужно
да чакаме до нова линия и се обадете на друг метод,
можете просто верига ги заедно.
И така, по този начин, ние можем наистина затегнете това.
Така че, това е буквално уеб сървър в пет линии
на общия код за разлика от -
за разлика от това, което обикновено може да трябва да направите, за да настроите нещо.
Ако отида в сървъра 2 сега, нека да направим това.
В сървъра 2 - всъщност нека се върне към този сървър 2.
Нека сега се отвори асинхр-0.js и справяне с този проблем в ръка.
Така че, първо, нека да отидем напред и отворен
нагоре асинхр-0.js в браузъра.
Така асинхр-0, пусни ме обратно към браузъра.
Хит презареждане.
И сега, това е вид на съобщение за грешка.
Всъщност аз съм виждам 500 в инспектор на Chrome.
Но нека по-точно поиска hello.txt.
OK. Така че, това изглежда да работи.
Така асинхр-0.js не изглежда да обслужват по нещо за наклонена черта.
Той има никаква подкрепа файла по подразбиране.
Но ако изрично поиска hello.txt,
, който изглежда да се подкрепят.
Защо е това?
Е, това, което съм отишъл тук
и извършва се изпълнява супер прост уеб сървър
, която демонстрира, когато asynchronicity може да бъде полезен.
Това се осъществява както следва.
Първо, аз съм с помощта на HTTP модул отново
но също FS които вероятно означава?
Като цяло в CS, файлова система.
OK файлова система.
Оттук нататък FS, файловата система.
Добре, и какво от това ще ми дадеш?
Функционалност, свързана с файлове като Първи премина,
отваряне на файлове, писане директории, четене директории
и всички тези неща.
Така че сега забележите, този код е същата, както и преди,
създаване на сървър, минаваща в анонимна функция.
Това е вид на произволни.
Това не е много сигурността на уеб сървъра.
Всъщност, можете да получите достъп до Най всеки файл на твърдия си диск
или на сървър е трудно шофиране с изпълнението на този код
защото аз съм просто сляпо ако приемем, че аз отивам
да вземете каквото и потребителят поискано в URL адреса.
И аз отивам да тя префикс с точка
така че аз съм незначително безопасни
като казва, каквото файл те могат искане трябва да най-малко старт
в текущата директория.
Разбира се, че има заплаха тук.
Защото, ако те вместо включва какво?
По пътя си, те могат да вид на работа около това.
Dot, точка, нали?
Така че, ако потребителят просто сложи точка, точка в URL адреса, на теория,
те биха могли да започнат да получават ми - и да каже парола файл.
Така, това не означава да бъде осигурено,
то е писано да бъде лесно.
Така че тук, имам променлива, която е конкатенацията на дот
който присъства на указателя и URL адреса на поискване
което видяхме преди като наклонена черта или / hello.txt.
Така че сега, той получава малко по-интересна.
Първо, забележете, на дъното.
Аз съм на звука за същия порт, както и преди.
Така че истинският интересните работа е вътре от тук.
Всеки път, когато искане идва от природата
на този кодекс, какво правя?
Обаждам файл метод за четене на файлове на системата,
минаваща по пътя че искам да прочета.
И сега, това е , което е интересно тук,
това е чрез прилагане в асинхронен метод.
Вие не можете да получат възвръщаемост стойност от четене на файлове.
В известие Всъщност има израз не лява ръка
отляво на четене файл.
Тя не връща стойност.
Вместо това, тя призовава обаждане функционира, когато тя е готова
да ти върна отговор.
Така че отново, за да бъде ясно, има предвид, че в недалечното минало,
в много програмиране езици, ако искате
да се чете преписка в точка PHP,
файл долна получите подчертае съдържание,
имате израз на лява ръка в цялата стойност, след това -
преди знака за равенство, това означава, че сте присвояване
за тази променлива връщането стойност на тази функция.
Можете да направите това в node.js, но обикновено имат
да се обадя изрично синхронен версии на функции като,
Мисля, че е чел синхронизация файл или синхронизация чете файл.
Забравих как те го нарекли.
И това ще даде Вие връщане на стойност.
Но ако този файл е на някоя отдалечена файлова система
или диск е просто естествено бавно, това може да отнеме 10 милисекунди
или 2 секунди за този файл действително да се върне.
В същото време, никой друг в Мрежата посетителите се обслужват
Вашият Websit.
Вие сте блокиране.
Това е, което се нарича блокиране на IO, вход / изход.
Така че тук, това е много по-умни.
Защото това, което се случва node.js
да се направи при тълкуването е следното,
тя ще се обади Методът за четене на файлове,
опитате да един до файла, който има път, определен от стойността стр.
И след това, ако и когато той е готов да ви даде обратно съдържанието
на файл P, ще се обадя функция, чийто подпис е
по силата на споразумение за следното.
Две аргументи, първият от което е може би един обект Грешка,
капитал E, това е един обект нарича грешка или Null
ако няма такава грешка.
И вторият аргумент - да се предприемат предположение - ще бъде това?
Тя се нарича данни, очевидно, но кои данни по-конкретно?
Съдържание >>?
>> Съдържанието на hello.txt в примера извадих
в браузъра си преди малко.
Така че с други думи, за да се чете файл и много node.js функции
като най-не се връщат стойности.
Те наричат ​​обратни извиквания и да премине
за тези обратни извиквания какво би са били традиционно
върне стойност.
В главата на този подход е
че може да се нарече прочетете файл с T0.
Мощта на функция за обратно извикване не да се нарече един кърлеж по-късно
така да се каже най-T, тя може да се нарече T1000,
хиляда кърлежи по-късно.
Но въпросът е, че останалата част от кода в този файл,
ако някой би веднага бъде изпълнена, докато node.js
и докато файловата система разбере как да се чете
този файл и да получите Върнете се в теб.
Така че можете да създадете това -
толкова ефективно илюзията
на паралелизъм, докато отдаване под наем бавни текущите процеси не е
блокира важните неща, частта, която обслужва потребители.
И така, как можем да се справим с това?
Това е много често срещана node.js парадигма.
И няма начин просто да се опрости това е, че ние ще видим, преди заедно.
Аз първо проверява дали Грешка не е нищожна.
Така че, ако това не е фалшива тогава е имало грешка.
Аз не знам какво е това, може би файлът не съществува.
Аз не са имали разрешения.
Името на пътя не е наред.
Всеки брой на нещата може да се обърка.
За сега, аз отивам да произволно върне 500
която е вътрешна грешка в сървъра.
Нещо се е объркало.
Не ми пука да се диагностицира.
Така че, нека просто да кажа на потребителя, че е счупен.
И след това, аз ще съм да се направи res.end,
и това е стенограмите нотация.
Припомнете си, че миналата време, което направих res.write
и след това, което направих res.end.
Ако искате да само изпрати една линия на продукцията,
може просто да го направя всичко наведнъж с res.end с аргумент,
и че ще изпрати независимо от съобщението за грешка е
във вътрешността на този обект към браузъра.
Тя беше доста искрене припомни преди малко.
Нямам представа какво е това означаваше, на пръв поглед.
Но когато поиска файл, който не съществува -
Опа, ние трябва да стартирате сървъра отново.
Когато поисках файл че не съществува, EISDIR,
така нещо за да е директория,
ако го направя някои случайни низ там,
очевидно, че означава файла, дори не съществува.
И това е така, защото моя код е просто казва да пишат
от каквото и суровите Съобщение за грешка е,
така че не е много удобен за потребителя но поне съм боравенето с него.
Иначе, ако това не беше грешка това, което правя?
Същото е както преди шиш от 200 OK, обикновен -
текст / обикновен тип ум и после изплю на данните.
И това е защо аз съм се на съдържание на hello.txt които просто
да потвърдите, ако аз погледнах в hello.txt,
това е буквално Здравей, свят.
И ако аз промених това Здравей, свят, запишете файла,
повторение на сървъра, презарежда страницата.
Сега, да получа тази версия.
Така че, аз наистина просто reimplemented уеб сървър
както е съществувала в продължение на много години, но с помощта на node.js.
Но ние можем да направим това дори по-чисто.
Нека отворим асинхр-1.js.
Сега, забележете, аз съм добавяне друг модул това време
очевидно модул път.
Сега, това е една добра възможност да се търси
на каква документация изглежда.
Node.js е документация.
Подобно на PHP мисля, че е всъщност е доста добра
и право напред.
Ако отида да node.js и Google и търсене на node.js път,
това, което ще видите, обикновено е пряка връзка към URL
че сложих тук преди малко.
Така / API е официалното място за да отидат за документация.
И това, което ще видите в горната
на официалната документация, възлова точка е всички методи и
или свойства във вътрешността на този модул,
единият от които се нарича съединение.
И се присъединят е функцията на помощник че ще ми позволите
да не се занимавам с всички плюсове.
И това е добавената бонус както ще видите
от доковете е също нормализира получената пътя.
Така че, ако потребителят или имате точки или точкови точки или всяка комбинация
на тези видове на относителна пътеки, сред квит
на метода е, че се присъедини то се случва да почистите всичко, което до
и ще ви даде каноничен път без
на тези точки или точкови точки.
Така че, това е нещо добро в общо за сигурност най-малко
ако сте проверка на върне стойност, която аз не съм
в този конкретен прост случай.
Но аз исках да го използвам.
Така че, аз сега се създаде пътека Малко по-програмно
с вместо path.join на Raw конкатенация.
Така, че е малко по-чист, отколкото преди.
И сега аз съм забележите, че е малко по-интелигентни, а
отколкото просто сляпо опитайте се да прочетете файла,
Отивам в действителност наричаме fs.stat.
Така че, ако сте запознати
с ниско ниво C функции и C, дори и PHP.
Много библиотеки имат Тази функция връща Stat
същество статистика върху даден файл, размера на файла,
разрешенията, името и такива неща,
и също така автоматично, ако файлът съществува или не,
и ако това е файл или директория
или символична връзка или нещо друго.
Така че сега забележи, че съм призовава fs.stat.
И тогава очевидно според към документацията,
Трябва да се връщам в обект Грешка
или Null последвано от надминаване обект.
Но нека да проверим това, node.js.fs.
Тук е файла Документацията на системата.
Нека да погледнем за статистиката.
Има много повече на функции тук.
Опа, тази статистика синхронизация, fs.stat.
Така че тук, това е асинхронен статистики (2).
Това означава, ако спомняте от основните страници,
глава 2 на главната страница,
това означава, че това е буквално просто изпълнение на възел
на ниско ниво функция система Stat.
Така че, обратно извикване получава две аргументи, грешка и Stat
където Stat е fs.stats обект.
Така че нека да видим какво този обект е трябвало да изглежда така.
Нека да щракнете върху хипервръзката и аз виждам това.
Обектът за надминаване съдържа явно някой метод помощник,
е файл, е директорията, е един куп други неща.
Това е "е" файла, който ми пука за в този конкретен случай.
Така че тук и да отида.
Ако е налице грешка, тогава нека само да спаси този път
и да поеме.
Ако има грешка, тя беше Вероятно файл 404 не е намерен.
Тя може да бъде нещо друго
но аз съм като малко мързелив тук, само за да се съсредоточи
на по-интересните детайли.
Но за потребителя цели, файлът не е намерен,
ако има някаква грешка посочва файла.
В противен случай, нека да се провери дали файл е наистина реален файл.
Така че, ако това не е файл, тя съществува.
Има нещо там, но това е може би една директория
или може би една символична връзка
или нещо друго, което е фънки върху файловата система.
Така или иначе, потребителят не трябва да го видя.
Така че сега, аз съм просто ще плюе
конвенционално неразрешено 403.
Но отново само на конвенция,
Бих могъл да използвам нещо друго на теория.
И тогава най-накрая, позволете ми да опитайте се да прочетете файла.
Така че, нека да превъртите надолу.
А сега забележи това е мястото, където кодът може да се получи малко разхвърлян,
забележите, че се обаждам fs.readFile преминаване
по същия път, същото обратно повикване последно време,
така предишната версия.
И след това, ако аз ще намеря -
ако не го намери, Плюя от 500.
И ако мога да го намеря, какво Онлайн отиваме да видите тук?
Отиваме, за да видите най-FS напиши заглавна 200 вероятно
и res.end изпращане действителните данни.
Но забележи това.
И това не е демонстративен на най-лошия сценарий.
Но аз имам този Stat повикване тук, отколкото аз имам някои неща.
След това, аз имам друг асинхронни разговор тук,
толкова повече вдлъбнатина.
Така че, просто вид екстраполира ако можеш от тук.
Какъв проблем има тенденция да възникват с език като JavaScript
в тази среда, в която не е нужно стойности за връщане
а по-скоро имате тези обратни извиквания.
И разбира се, това е само нещо стилистичен факта,
че аз продължавам редовете.
Но за това е това на логичната следваща стъпка.
Да предположим, че е имало един или два или три други функции
че трябва да се изпълни, че бяха по природа асинхронни
и затова просто вид запази редовете да се справиш с тях,
да се справиш с тях, за да се справиш с тях.
Можете да получите вид на обаждане ада, тъй като хората го наричат
където вашия код започва да получи много широка
и честно казано наистина трудно да се чете.
Както и да е, аз мога вид едва кажа, че това е нещо като поток
, който има този вид
от стилистично ъглов нещо, което се случва тук.
Така, това не е идеално, тъй това може много бързо да се превърне
тромава, въпреки че две асинхронен не призовава
такава голяма сделка.
Така че, можем да избегнем това, нали?
Може да сте зърнал, че I misclicked преди малко.
В документацията, вие знаете, тя изглежда като има statSync.
И statSync не взема обаждане като аргумент.
Това отнема само пътя, защото тя очевидно какво прави?
Тя връща инстанция на fs.stats.
Така че това може да ви бъде първият инстинкт, нали?
Особено, ако функции за обратно извикване
и asynchronicity е малко ново за вас, честно казано,
най-лесният начин е вероятно Просто се избегне проблемът всички
заедно, да се върна, за да сортирате на CS101 стил програмиране
когато ти се обадя функция или метод, връща стойност
извикване на функция, се връща стойността,
функция, връща стойността.
И мога да използвам тази причина fs.statSync
което е буквално същото но това е синхронен версия
което означава, че се връща стойността.
Тя не мине стойност за обаждане.
Но защо, че най-вероятно да бъде неоптимално заобиколно решение да се прибегне
да синхронни функции?
Да?
[Безшумен Забележка]
Точно така, това отнема много време.
Ти просто се забавя всичко надолу.
Тъй като много като Shake Shack или Tasty Burger, ако те се отървах
на тези зумери и сте направили, клиентът стои в предната част
на линия, докато храната е готова преди дори като заповедта
на лицето, зад вие очевидно
чрез пут забавя.
Хората започват да напускат, ти нещо изготви пакети.
Вие може да направи всеки брой аналогии тук.
Но накратко, това е вероятно не е нещо добро
за бизнес или за сървъра.
Така асинхронен код е обикновено най-малко добър
в този случай, но определено започва да предизвика някои тревога.
И всъщност аз смея да кажа, когато първо писмено тези неща,
Ще отнеме малко малко време за опознаване.
Така че, нека да започнем да се оборудват ти с някои библиотеки
и техники, за да направят това е малко по-лесно.
Така, един от най-често срещаните библиотеки са популярни библиотеки
тези дни, това една, наречена async.js.
И подобно на много node.js библиотеки или модули,
всички те са с отворен код.
Те почти всички са живи и да получите Център за хранилища, което е вид
на превърна в де факто място за съхранение на тези неща.
И тогава там е цялата инфраструктура
за инсталирането на тези неща наречен NPM, Node пакет мениджър
които, ако сте запознати с EvanTube е вид
на подобно приложение или приложение получите.
Ако сте запознати с Red Hat и Fedora
като в уреда, това е като Yum.
Но това е един възел - това е за управление на пакетите просто
за тази среда.
Така че, ние можем да изтеглите и инсталирате неща като асинхр библиотеката
, а също и друг един наречен подчертае библиотека или модул.
Но тези, доколкото FS, HTTP, път,
това са всички идват вграден в възел.
Така че, ако се върнем към докторите на API, вие всъщност ще видите, че построен
в възел вие получавате безплатно цял куп модули.
Но много приятни хора на интернет са направили десетки
ако не стотици други библиотеки
да направи нещата по-добре или по различен начин.
Така че, нека да разгледаме най- как работи тази библиотека.
Така че, повечето от този код е идентичен за момента.
Имам един път е създадени до върха.
И сега, аз се обаждам async.series.
Така че асинхр библиотеката, това е просто библиотека, която ви позволява
да премине или рейз обикновено на функции да се наричат ​​един
след друг само за да вид избегне отстъп въпрос,
и наистина просто менталното тревога, че неизменно ще възникне
най-малко, когато за първи път потопите в до този на собствения си
с програмиране асинхронно.
Както и в настрана, ако сте приели 161 и сте се справиха с ключалки
и повишаване на условия и всички на това, асинхронен код
и среда, като node.js всъщност е много,
много по-просто може би
отколкото в действителност писане многонишков код.
Всеки път, когато има многонишков код,
имате условия рейз.
Вие трябва да се тревожи за две нишки, съдържащи
за едни и същи ресурси диск или памет.
Красотата на JavaScript
в node.js е, че има буквално само една нишка,
което означава, че браузъра
само или на сървър може да направи едно нещо наведнъж.
Това е само до вас, програмиста
да се поддържа психичното модел за как някак си вадя неща
и да разбера как да поръчате вашия код.
Но никога не трябва да се притеснявате за повишаване условия
в доста по същия начин, по поне с Raw код като този.
Така, че е малко Трудно е да grack тук.
Но - Така че нека да се отвори докторите само за миг.
В async.js библиотека, която По същия начин е много googleable,
тя живее в GitHub repot като много от тях.
Не мисля, че е непълни, не е така.
Позволете ми да превъртите надолу към Прочети ми тук.
Така че, асинхр библиотеката осигурява цял куп
на методи вътре в него.
Например, има метод наречен всеки,
които, ако щракна това просто , за да видите своите документи за миг,
това е функция или метод , която ви позволява да направите нещо
като всеки четири но паралелно.
Всички те ще се случи потенциално паралелно.
И всеки метод е само Ще се върна при теб, когато всички
на повторения са пълни.
Така че може би те се случи един след друг.
В идеалния случай, те се случи по същество паралелно.
Но този метод не ти се обадя пак.
Тя не бръмча си зумер до всички
на елементите, които имат итерирания над са завършили.
Така че, това е просто един приятен начин
избягване на използване прост четири контур
но всъщност прави нещо асинхронно.
Но сега по-пряко свързани с този пример,
забележите, че има тази метод серия.
И нека просто издърпайте нагоре прост пример каноничен.
Така че асинхр библиотеки, серия метод отнема в като подразбиращи
от квадратните скоби в масив.
Какви са данните видове елементи
в този масив на базата на един прост пример?
Това е набор от функции.
Така че в C, което бихте нарекли тях функционира указатели.
В JavaScript, има повече правилно препраща към функциите
или анонимни функции.
И това просто означава, масиви
разбира се поръча от нула нагоре.
Така че, те са поддържали нареждане, което е добро
за серия, серия А кауза Разбира средства да направят нещо
с цел да не паралелно.
Така че, това просто означава, че този функция ще се изпълнява,
след това, след това един, този, след това,
колкото и многобройни да са
докато накрая опционален обаждане се нарича.
Така че, забележете парадигмата тук.
И въпреки, че този е един човек библиотека,
това е представител на много чести парадигма JavaScript
на отново чрез обратни извиквания.
Така че, забележете, това, което правите тук.
В първата функция е приет през чрез този масив,
Вие определено анонимен функция само с функция.
Но забележете, че очевидно в съответствие с тази документация,
че анонимен функция трябва вземе аргумент обаждане.
Това ще бъде една показалка или препратка към функция
че трябва да се обадите, когато вашият код е готов да върне стойност.
Така че отново, за разлика от просто обикновено процедурно програмиране
където сте свикнали да Връщане на стойности веднага
че една разлика с използване на библиотека като тази
в асинхронно програмиране повече като цяло, е, когато сте готови
да върне стойност от база данни, от файл,
от аритметична израз, това е до вас
за извикване на функция за обратно извикване.
И хубавото за тази библиотека
ако четем докторите по-внимателно е, че
ако и само ако всички Районът на обратни извиквания, наречен
без обект Грешка, ще наследи цялото това нещо?
С други думи, ако има 2,
ако има 10 анонимен функции
в този масив следователно в тази серия,
само ако всички от тях да успее,
ще финалната опция за обратно извикване се счита за успешно?
Ако някой от тях се провали, всяка функция
след това не ще дори да бъде екзекутиран.
Така че, това е един добър начин за сортиране на наличието на маргаритка верига
че прекъсва преждевременно ако нещо се обърка.
Така че, за да видите това в контекст, тук е как бихме могли да приведе отново в действие
че предишната програма.
Получавам по пътя, както и преди, така че това е най-лесната част.
Копирам поставете този код скелет
от документацията там async.series отворена скоба,
отвори квадратна скоба.
И сега забележите Имам един функция в това начало
на второ място, ще видим Където и да отидем от този.
А сега забележи, че това е малък комплекс на първа
а да се съсредоточи само върху това ред по ред.
Fs.stat означава получите статистиката или това, което не е от този път.
Обадете това обаждане, когато сте готови.
Този код е същата, както и преди.
Ако има грешка, има една разлика сега.
Отново, много често парадигма в node.js програмиране е
ако нещо се обърка и обаждане трябва да знае
че по силата на споразумение, на първо аргумент за обаждане ще
да не е, ако всичко е наред или препратка към обект Грешка,
капитал E. Това е като грешка клас, който съществува в световен мащаб
но повече за това някой друг път.
Така че по този начин, ако има един грешка, какъв е изводът?
Е на базата на това, което аз каза серията прави,
е, че ако нещо се погрешно, ние просто вид искате
да се откажем цялата серия на анонимна функция повиквания.
Значи, това е достатъчно за мен да Просто се върнете обаждане преминаване
в обект на грешка.
Защото ако Stat даде ми върна грешка,
Можех да създадете нов Грешка обект на моята собствена,
но аз наистина не се грижи за,
Аз просто искам да премине на каквото и да било грешка е, че всъщност се случи
за да мога да го давате за това обаждане.
И само за да бъде ясно, на завръщане не е строго необходимо.
Аз основно искам да направя това но аз исках сега да "се върне;
/ / Така, че не повече код тук изпълнява ".
Така че отново друга често срещана конвенция в JavaScript,
въпреки че не сте връщане на стойност сами по себе си,
искате да премине стойността функцията за обратно извикване
но след това, което искате да спре изпълнението
на функцията, която сте в, тривиалния начин
да направите това е просто да се обадя върне тук.
Но няма нищо лошо,
ние просто правим връщане обаждане грешка, въпреки че то се случва
да се върне в неопределена стойност.
Добре, това не прави връща стойност най-вероятно.
Всичко, което се грижи за е качите по-нататъшното изпълнение.
Така че, моето сливане на тези две линии е просто един стилист
към Конвенцията, само за да Трябва броят на линия
на код аз просто написах 2-1.
И така, какво друго?
Ако там не е грешка -
действително да бъде ясно Аз също може да се избегне
че правейки ако друго.
Но отново, друга обща парадигма е проверка
за вашите грешки до върха и след това Просто се върне по-скоро, отколкото да продължи
да отстъп вашия код с иначе и иначе и иначе.
Така че, ако това не е файл, сега, вие знаете,
Искам да се справим с това малко специално.
Така че тук, както в Java или C + + или на няколко други езици,
ето как може да инстанциира възразят срещу въведете преминаване грешка
в съобщение по подразбиране не файл
и това е просто малко произволно.
Но аз съм сигнализация грешка на моята собствена.
И какво означава това последно Онлайн вероятно означава?
Всичко е добре.
Ако премине в нула за на параметър грешка, това означава само
по условие, цялата е добре.
Така че, това означава, че това, което ще се случи логично?
Ако нула преминава за обратно извикване
това означава, че този анонимен функция е успял
така да се каже.
Така че, какво трябва серията метод предхожда и сега се основава
на моя словесна дефиниция по-рано?
[Безшумен Забележка]
Преминете към следващата една, нали?
Ако това се беше върнал непразна стойност, тя просто ще се откажем
и не повече анонимен функция ще се нарича.
Но тъй като това не е, тогава това ще се нарича следващия.
Така че, логиката тук е почти същото, както преди
и ще видим как да почистите това до допълнително в един миг.
Осъзнавам, че това е вид на много
да поеме цялата устно и визуално.
Но сега забележи, на второ анонимна функция, която искам
да се изпълни в серия е да се опитате да прочетете файла.
Обадете това обаждане , когато сте готови.
Ако има грешка, просто тя сигнализира по пътя на обратно извикване
така че останалата част от тези неща абортира.
Else връщане нула.
Но защо съм минаваща в два аргумента?
Ами това време, ако Четох файла и да се върнат
като променлива, наречена данни,
Искам не само да означава всичко е добре, като се върнете нула
за първи аргумент.
Искам да се върна на действителното данни като втори аргумент.
Защото ако прочетете по-нататък в документацията,
забележите това последно парче от код квадратна скоба означава, че е
край на серията.
Имаше само две анонимни функции в тази серия.
Ако е имало грешка тук, а след това Знам, че една от връзките
в тази верига, така да се говори не успя.
С други думи, тази грешка ще бъде обект Грешка
че е нищожна, ако някоя от тези момчета не успяха.
И ако това е така, аз съм просто ще спаси и аз отивам
да се каже, 400, което означава искане се провали,
това е много генерични съобщение за грешка.
И тогава, аз ще отпечата съобщение за грешка.
Така че, аз не съм си прави труда да бъде супер анален този път,
Аз няма да се прави разлика между 500 и 404 и 403,
Аз съм просто вид сляпо махам с ръка
и да кажа нещо се е объркало.
Но ако нищо не направи да се обърка,
Отивам да изпратя това res.end минава тези данни.
Сега това изглежда малко загадъчен.
Но отново, ако Четох документацията,
вторият аргумент за тази последна, крайна обратно повикване,
човекът, който е само екзекутиран веднъж серия се извършва
изпълнение или част има на, това ще бъде масив
на всички втори аргументи
, които са преминали за обратно извикване.
Сега се оказва, че единствената връзка в тази серия
че всъщност се върнете към втория аргумент е този тук.
Така че аз ще трябва да реши по скок на вярата просто използвайте предполагам
за момента, в който последният е метод
, която ви дава последен елементите на масив.
Защото този масив това е да се прехвърлят
за мен има два вида индекси, нула и единица.
Това е просто нула няма никаква стойност защото този човек се връща -
не преминава в секунда аргумент, но този човек прави.
Така че води скоба нулата е нищо,
резултати скоба един съдържа какво,
ако сте били след заедно до този момент?
Файлът, за здравей, свят съдържание вероятно,
така че това е как аз всъщност да го отпечатате.
И нека да завърша една подробност тук.
Ако го направя този вид на стар училище, ако искате да получите
в последните елементи, ако можех направи резултата [results.length-1],
това е нещо като старата школа начин
на достъп до последните елементи в - или нулев индекс масив.
Но, както в страната, припомни че имах тази библиотека
тук долна черта, която от конвенцията е просто нарича
буквално долна черта характер, които не е специален,
тя просто изглежда готино като знака за долар прави за Jquery.
Това е само един помощник метод подчертае точка миналата
че прави точно това, едно и също нещо.
И ако никога не сте го използвали преди подчертае JS както
за клиентска страна кодиране
и от страна на сървъра е чудесно полезно библиотека
че най-много хора, описани Харесва Jquery съдържа всички
от методите, хората желаят дойде със себе JavaScript.
OK.
>> Така че, подобно на доста за мен и Гледах в серията,
имате подобно обаждане като аргумент?
>> Да.
Подобно >> така че когато всъщност като тласък, че в,
и подобно на това, което прави предвид, когато просто трябва
като за обратно повикване и след това направете като -
[Безшумен Забележка]
>> OK, добър въпрос.
Така че, нека да дръпнете нагоре асинхр главната страница тук
или документацията на GetHub.
Така че това е каноническа структура.
Ако сте повикване с използване на тази специфичен метод серия,
Има две големи части към него.
Един от тях е набор от анонимни функции
и две е крайна обаждане функция, която е всъщност
изпълнена в самото край на серията.
Сега, ако ние я увеличите в малко по-близо от първия
на тези големи неща, за масив на анонимни функции
по изискване на настоящата документация човек има
да бъде анонимен функция, която взима
в един аргумент, наречен обаждане или Foo или бар, тя не е от значение
но той го нарече обаждане.
И това е нещо си зумер че Shake Shack ви ръце.
Това е средството, чрез което можете да се върнете на стойност
на клиента, защото не може просто да се буквално се върне.
Вие трябва да го направите, като начин на обаждане.
Защото, ако в рамките на този функция е някакъв бавно движение
код, като база данни заявка, прочетете файла от файловата система,
вие не искате да чакате там и блокира всички останали,
който искате да повикате обратно извикване.
Така че, това е буквално името на аргумента.
Но като в C, можете има функция указатели.
В Java имате методи референтна система
и също тук, в JavaScript.
Това е променлива, но неговия вид е функция.
Така че просто като пишете името си дали обаждане или Foo
или бар, след това отворете скоби и в близост скоби,
ти извърши това, на тази функция.
И преминаване нулев които означава нулева грешка и едно
което означава, че това е данни, които искам да премине инча
И след това парчето да бъде ясна, това е друго обаждане.
И това не се нарича обратно повикване,
тя просто концептуално е метод функция за обратно извикване
защото тя се нарича по дефиниция
на този автор е библиотека, когато цялата серия е завършил
или в подгрупа от него, ако грешка се е случило по-рано.
Така че, име на функция за обратно извикване, призовава обаждане функция,
име на функция за обратно извикване, призовава обаждане функция,
различен обаждане функционират всички заедно.
>> Ние сега имаме като дефинира обаждане?
>> Не, защото този човек ще премине в масив
на анонимни функции,
указател към кода той иска да изпълни.
Точно така, всичко е наред.
Така че, моля да се каже, че код стане малко по-лесно.
Така, че може.
И ако сте като мен, да вземе комфорт в най-малко знаят,
това отнема време, за да да свикна с това.
Но ние можем да почистите това създаде малко,
да не се хвърлят твърде много за вас но тук е друг вариант
и се използва друг метод
в същата библиотека наречен водопад.
В главата на която е за разлика от серията, където всеки
на тези анонимни функции, изпълнявани по същество
независимо от всеки от другите.
Водопад като име предполагат позволява на горните функции
някак да премине в стойности към долната функция
Нещо като каскада от вода.
Така посока нагоре на тази е, че аз мога вид
на използвате това, за да си предимство.
В async.waterfall, забележите следното.
Мога само да се обадя fs.stat минаваща по пътя
че аз искам да отида статистически данни за.
И тогава си спомня, преди да имаше анонимен функция
че имаше два аргумента заблуждават,
ЕЗУЛТАТИ и след това се обадих на функция за обратно извикване ръчно?
С други думи е само за да бъде ясно, припомни, че по-рано
в асинхр 2, Направих всичко на тази груба работа.
Обадих fs.stat приет през P,
обявена моя собствен анонимен функция.
Тогава аз проверих дали е грешка не нула тогава аз направих това,
иначе аз направих това, като цяло красота на следните конвенции
като в node.js е, че обаждане функции по принцип са предназначени
да вземе поне един аргумент, обект Грешка последван от нула
или повече полезни стойности.
Така че забележите парадигмата тук,
тази функция за обратно извикване съм деклариране следва точно
парадигма, че този човек асинхр библиотека прави.
Което е да го кажа, защо съм I прилагане собствената ми обаждане
метод, когато авторът на това библиотека е буквално ми подаде
на тепсия, така да се каже, функция за обратно извикване мога да използвам?
Така че, аз може просто да мине на справочен той ми даде
така че веднага, ми няколко реда
на код се превърне в един ред код.
Сега, къде отиваме с това?
Следващата функция, която Искам да се изпълни,
следващата анонимните функция в този масив
на функции прави следното.
Забележете първо Stat е първият аргумент.
Така че има нещо променило вече.
Сега, този човек, който написа на библиотеката -
и аз казвам, че човек защото това е един човек.
Този човек, който е написал тази библиотека е за документиране на гаранции
че ако тази функция тук ме връща обратно обект Грешка
или нула, последвано от кома списък, разделен на други ценности,
той ще се уверите, че тези други ценности се предават
до тази анонимна функция в ред от ляво на дясно.
И това, което се използва, за да бъде само функция за обратно извикване сам просто
става последният подобен аргумент.
Сега, аз не знам кой съм се фокусира върху само ти знаеш.
Но сега, какъв е отнеме тук?
Така че, ние знаем от документацията
или преди няколко примери
че в крайна сметка очаква fs.stat обаждане с два аргумента,
обекта грешка, която е Грешка обект или нула, последвана
с позоваване на статистики обект.
Така че, ако аз мисля за това, Обект Грешка кома надминаване възразяват,
, което се вписва в парадигмата от библиотека на този човек.
Така че, мога да кажа само, защото I No втория аргумент
Това е всичко - че това ще да бъде приет от fs.stat
за обратно извикване е допуснал грешка, статистика чрез определяне на тази библиотека,
Мога да сложа край на втория име аргумент е тук
или каквото и да мога да го преименувате
ако искам последвано от отклик тук.
Така че, аз може да премине една ценим от тук до тук.
Сега, всичко на този кодекс обаче несъмнено донякъде загадъчен е
поне копирате паста за по-голямата част от преди.
Единствената разлика е, известие тук съм, обявяващо дадена грешка
възрази и сега искам да се получи малко по-красиви.
Аз всъщност искам да знам какво грешката е, така че аз ще
да пъхнете вътре в този обект, а имот произволно нарича код
, така че аз знам, че това не е файл
че трябва да бъде неразрешен, това е HTTP 403.
Нека помним, че преди Минавам обект Грешка
за обратно извикване.
И тогава най-накрая се опита да чете файла, така че в този случай,
водопада, аз съм разбит кода от две големи стъпки
в три по-малки стъпки.
Обърнете внимание на красотата тук,
Мога да се обадя fs.readFile минаваща по пътя.
И тогава най-трудната част умствено, е просто да премине
в човека е обаждане.
Това, което той ми подаде, аз съм ще се премине към fs.readFile.
Защото всички ние сме се придържа на същите конвенции,
първият аргумент за обаждане е обект Грешка или нула, последвана
от кома или разделени списък с полезни неща.
Така че, това, което означава, че сега и ако I прочетете документацията ще знам
този, последния отклик този човек тук, извън
на квадратните скоби се случва да бъде приет в обект Грешка
или нулев, което трябва да се провери за както винаги с този код тук.
И тогава по дефиниция на този метод
в документацията на човек е, последната стойност се връща
от последния метод в моя анонимен масив -
ми масив от анонимни функции.
Така че, това, което се чете файл завръщане
и аз съм с помощта на връщане хлабаво сега.
Искам да кажа това, което не чете файл пас като аргументи
метод на обаждане му ръка?
Две аргументи, първо е обект Грешка или нула,
това е почти винаги ще бъде отговорът.
И второто нещо, което се случва да бъде това, за четене на файл?
Съдържанието на файла, данни, както ние го наричат ​​по-рано.
Така че, като просто се обявява заблуждават, да доведе,
и се проверява за грешка това е някак скучно сега.
Иначе, аз правя res.end преминаващ в този резултат.
Това несъмнено ще не се синхронизира в перфектно
докато всъщност го напиша сам.
Но за сега, да вземе далеч по-малко факта
че е очевидно този обща парадигма, при която, ако ние
и автори на библиотеки сортиране на всички пръчка
с тази конвенция методи на обратно повикване.
И първият аргумент е обект Грешка или нула.
И втората и третата
и четвърто обекти са неща ние се грижим за и ние сортиране
на следват правила и документация.
Ние започнахме с код, който честно казано е доста грозно.
И въпреки, че най-новите Пример за това е, честно казано малко трудно
да увийте ума си наоколо, това е най-малко визуално,
Изглежда, че е много по-силно.
И след като веднъж сте се удобно с нея, тя е много по-лесно
и това е толкова много по-малко склонни към бъгове, отколкото, че предишния пример.
Така че, нека да докажат, едно последно нещо тук.
Това е вариант три.
И - Не, нека оставим Само през тази една.
Нека да отидат в няколко други неща, като последните закачки.
Добре, така че в сървъра 2.
OK. Първо, каквито и да било въпроси, Знам, че това е много
но искаше повече инструкции, така?
Ти не каза добра инструкция е задължително.
Да?
[Безшумен Забележка]
Правилно, вие сте по същество снизходителен към операционната система
да разбера как да жонглирам всички тези топки наведнъж,
четене от файл, четене от база данни.
И това е този сървър JavaScript се увери, че е единствен резба.
И по същество и действително,
има една картина Аз не повърна,
и това не е задължително всичко, което поучително
но може би ще даде си мисловен модел.
JavaScript се и възел
по-специално има тази т.нар събитие линия.
, При която можеш да се сетиш на node.js, програмата,
е буквално като безкраен цикъл.
Това е просто един див контур, чакайки и чака и чака,
търси за задачи, за да се изпълни.
И задачата може да бъде, отидете донесе нещо от база данни
или тук е на стойност от база данни или да отидете да получите този файл
от диск или тук е да поиска от потребителя.
Всякакъв вид на събитието, точно като на браузъри събитието задвижване,
така като сървър странично събитие задвижване.
И всяко едно от тези неща представляват събития.
Така че някой в ​​node.js, просто пише един безкраен цикъл,
голям див контур, чакайки за неща, за да се случи.
И тъй като нещата не се случи, то се озовава в една опашка, нали?
Разбира се, на база данни може да върне стойност.
И една файлова система, операционната система може да върне стойност
приблизително по същото време но там вероятно ще
за някои преподреждане към тях.
И node.js ще имат по същество една опашка
като голям масив или вектор, на структура данни
буферите всички от тези неща.
Тъй като това може буквално само се справят една от тях в даден момент.
Така че, когато, разработчик,
писането асинхронен JavaScript код чрез асинхронни
функция, което позволява на този т.нар събитие контур да отида
към следващия кърлежи, нали?
Така че, докато вие веднага се върне, тъй като всички
на тези асинхронни методи Харесва ли четене на файлове и Stat,
те се връщат незабавно защото в крайна сметка за обратно извикване
се върне.
Веднага след като се върне,
това означава, че някой друг може да се показа на разстояние от запаса тук
или че тя може да се пръснах в предната част на опашката тук.
И така, има в Всъщност сериализация
на всичко, което се случва,
макар че всички тези неща може да се случва паралелно
на многонишков система.
Но себе си и node.js сървъра вървяхте
като един конец.
И долната страна на която е т не непременно макс
от вашия компютър способност е особено
ако имате ядро ​​16 или дори 2 ядро ​​компютър
а ти си само с тичане едно копие на възел.
Но ако сте отново взето нещо като 161,
да се избегне огромен кошмар главоболия, когато става въпрос
да се състезава условия и ключалки и семафор
и писане наистина многонишков код,
така че ползата или вредата.
OK. Така че, обратно на кода тук, позволете ми да предложа да започнем
да се опростят нещата малко по малко.
Видяхме сървъра едно малко Преди която изглеждаше така.
Така че, това е може би най- доста проста.
Но точно като в света на PHP, има рамки
като Laravel и има неща като Rails и Django,
едно и също нещо в node.js света.
И ние ще харчат повече време за това в сряда
и в следващия проект.
Но ако отида в сървъра 2 директорията,
забележите няколко парадигми тук.
Така че това е - има ли да бъде еквивалентен например
но това е с помощта на рамка, наречена express.js,
който е безплатен отворен код софтуер като Rails и Django,
като Laravel, че е просто в крайна сметка ще
да бъдат недооценени днес Защото ние сме били писане
такива прости примери.
Но ни се доверите.
Това ще много бързо стане ваш приятел
тъй като това ще ви спести Вие много TDS код.
И една обща парадигма за на express.js приложение е
За да имате app.js или server.js файл, който съдържа логиката
на вашата програма или по поне на входната точка.
Можете да имате множество файлове.
Поддиректория модул A възел който има библиотеки
че сте изтеглили като асинхр
и изрази себе си в другите.
И тогава package.json, package.json изглежда така,
и можете да я създадете ръчно или инструменти, да го създаде за вас
и това е буквално файл JSON
и интересната част е зависимостите тук.
Точно като във Laravel, вие Трябваше че продавач директорията
а ти трябваше да се тревожи за опаковки и правим -
всъщност актуализиране с Artisan или подобни команди,
на вас библиотеки са инсталирани,
По същия начин с package.json тук и да управлявате библиотеките
и версии че те е грижа за.
Така че, ако имам package.json, Не мога просто да направя NPM,
Node Package Manger инсталирате, то се случва автоматично да потърсите
по това package.json файл.
Погледнете и вижте, аз правя имате най-новата версия
на всички модули на продавачите
в възел подчертават модули указател тук или може би
в някои родител или прародител директория.
И ако не е, това е Ще ги изтеглите
и вие ще видите един куп
на HTTP неща ще през проводник.
Така например, нека ме ви покаже съдържанието
на модули възли, само за да изразя.
Нека да вървим напред и смело изтриете модули възли
така че всичко, което имам сега е това.
И ако аз NPM инсталирате, ще се види, че това се случва, за да прочетете
че package.json файл и сме виждали подобен изход
на това в света Laravel.
Това е изтегляне на цялата куп неща, и това е
защото изрично от своя страна зависи от цял ​​куп
на други народи библиотеки.
Така че, всички тези, които са нещо като се изтеглят рекурсивно.
До сега, ако го направя в LS отново,
Ето го моят възел модули указател обратно
и изрази като обратно.
Така че това е просто начин на опростява управлението на пакет.
Сега, ако се вгледаме в app.js файл, това ще
да бъде връщане към най-ранният ни уеб сървър
където ние просто плюе навън "Здравей, свят".
Но забележете парадигмите тук,
първо ние изискваме изричното модул, тогава имаме тази линия
на код, който знаете от документацията.
Можете буквално да третира този променлива модул като функция
толкова отворени скоби близо скобите означава, го изпълни.
Това ще изглежда се върне нещо, което ние отиваме
основно наричаме ап.
Как става това?
Аз наистина не знам.
Ще оставя някой друг, вие знаете, в изричното света пиша това.
Отивам сега да стои на неговите или нейните рамене, така че
да направи моята кандидатура работи малко по-просто.
Ето, аз ще слушам върху този конкретен порт
който може да бъде почти всичко.
И тук е код, който е може и повече напомня сега
на Laravel и routes.php.
Така че това е просто вечеря, аз съм просто ще укажете маршрут
за наклонена черта звезда, така че всичко ще трябва да бъде погълната
от това искане манипулатор.
Парадигмата за заявките е неговата анонимна функция
с аргумент поискване
и обект на отговор точно както преди.
И res.send в експресните средства ви изпрати кода последвано
от каквото и да искате да изпратите.
И, разбира се, можете да направи нещо по-красиви
от действително изпращане файлове или HTML
или динамично генерирани съдържание.
Но за сега, всичко, което направихме се изплюе Здравей, свят.
Ако влезем в сървъра три, това е още по-красиви просто
да ви покажа част от функционалността.
И ние ще ви покажем един дори по-секси версия
на този в сряда.
Но ако някога сте чували на Socket IO може би,
така че аз мисля, Jonathan или някой каза по-рано,
едно от нещата, възел е наистина известен
е неговата реална време поведение, нали?
Помислете за PHP в MySQL, ако са за изпълнение на сървър за лафче
в PHP, при която двама души биха могли отворете прозореца на браузъра, за да foo.com
и след това да започне IMing всеки друга, Алиса в страната на един прозорец,
Боб в друг, така че всеки от тях вижда му
или посланията си в другия прозорец.
Как ще направите това в PHP и MySQL?
Следователно, използването или неизползването на Laravel сортиране на несъществен, можете да имате
като index.php файл.
И трябва да имаш - в някои случаи това трябва да се изплюе
от форма, така че има ще бъде HTML форма
Това вероятно не подава чрез нормално подаване форма
но Ajax вероятно, нали?
Така че, за да представи на манипулатор, така , който въвеждате в текстово поле,
ви удари влиза и след това той получава изпраща на сървъра чрез Ajax.
Какво правиш тогава правя на сървъра?
Така че, имаш index.php
или нещо дот PHP, че е получена в HTTP параметър
от страна на потребителя, Алис или Боб мигновени съобщения, с какво се занимаваш
с него, за да го разпространяват Боб или Алис, съответно?
Аз ви кажа буквално Разполагаме с необходимите средства, с които
да направи това в своя мин.
Така че, като това, което ще направите?
Имате една минута, за да изпълнение на настоящата програма.
Да?
[Безшумен Забележка]
Perfect. Нали, така имаш база данни.
Ние знаем малко малко за MySQL.
Така че, имате таблица това е съобщение,
Може би има пъти печат, потребителско ID,
тялото на съобщението Самата създаден, че
осъвременяване и че всичко това.
Така че, вие се съхранява в база данни.
И предполагам, че Алис изпраща първо съобщение, как Боб се
това съобщение сега от базата данни?
>> Може да е някакъв Ajax отговор, който постоянно се случва
обратно към базата данни топ получите [недоловим].
>> Точно така.
Така код на Боб, който е код е същите като Алис е просто вид
на симетрична връзка,
Браузър Bob има някои Ajax код това е може би, може би на всеки 30
секунди, дърпащи сървър чрез Ajax синхронизация,
има нови съобщения?
Има нови съобщения?
На всеки 30 секунди се случва да бъде вид неоптимално
защото той трябва да чакат още
ако Алис буквално просто е изпратил съобщението.
Така че, браузър Боб можеше всеки втори хит на сървъра.
Но това означава, че на Алис Браузърът се удря сървъра
всяка секунда.
Ами Чарли [Предположи правопис]
и Дейвид [предположи правопис] и Едуард [предположи правопис]
и всяко друго писмо от азбуката?
Какъв е проблемът на този подход?
A много хитове прекомерни -
Искам да кажа, ти си просто ефективно Дозиране свой собствен поглед
или DDOSing, Разпределени Denial Of Service атака
на собствения си сайт, от които имат всички
от тези потребители тече JavaScript код, който току-що пратите на
чесало от вашия сървър дори ако произволен брой,
80 процента от времето никой не е казал нищо
в стаята за чат.
Но ти си просто проверка да се уверите, на такава.
Така че PHP в много езици просто не са добри
за реални комуникации време.
Защото в PHP отзоваване има няма централна памет, нали?
Имате сесия обекти което създава илюзията
на централно съхранение, но това е на базата на броя на потребителите.
Не е нужно глобалната памет както го правите в Java Servlet
в познати или в друга рамка работи по този начин.
Node.js все пак, нали трябва глобалната памет, защото имате
един сървър и, че "може да Спомням си всичко, което иска
за всички потребители.
И вие все още може да има база данни.
Но хубавото node.js твърде е, че е много по-добре
отколкото нещо като PHP и създавайки илюзията
на работа с множествена неща наведнъж.
И в действителност, както в настрана, можете приложат чат сървъри в PHP,
но обикновено би направил нещо, наречено дълго избирателните
при което не пинг сървъра всяка секунда.
Можете да пинг на сървъра, сървъра не отговори на вас
за нагоре на 30 секунди, той буквално седи
в цикъл чака и чака.
И проверки на сървър, ако Има нови данни в базата данни
и едва след това те вижда: "О, тук е съобщение от Bob "
пък отговори на HTP сървъра?
Така че ефектът от промяната за вашия браузър е, че иконата на IE или Mozilla
или каквото и просто продължава предене продължение на 30 секунди в даден момент.
Но нагоре е, че не правим има 30 заявки за свързване
в рамките на 30 секунди, вие разполагате с такъв.
Така че тя се нарича дълго поискване.
Но дори и по-добре в модерен уеб браузъри е нещо, наречено
WebSocket, който вземете CS143,
вие може ефективно да се направи TCP връзка от клиенти
като браузър за сървъра и след това се придържа към него
без да се използват почти колкото се може повече ресурси
като HTTP може традиционно правим.
И Socket IO е а node.js библиотека
, което го прави много по-лесно да направи гнездо връзки
или илюзии там при за стари браузъри
така че можете да реализирате тази реална функционалност на време.
Така че, тук е един пример.
Това нещо до върха получава малко по-сложно
но това е най-вече да копирате и поставяте от документация socket.io лидер.
Ето сега е по- конкретно искане манипулатор.
Ако потребителският искане за наклонена черта, това, което файл отивам
да бъде очевидно служа до тях?
Index.html.
А има и някои нови неща тук поток
които аз ще ви покажа само за миг.
Но това е просто още един начин
на заграбването на файл малко по-ефективно
отколкото просто правиш fs.readFile.
Това е малко по-разумната особено за големи файлове.
Така че, дълга история кратко, тези линии само за да служат
създава файл, наречен index.html
които за сега приемем съдържа HTML форма, чрез която Alice
и Боб може да съобщя.
Накрая, io.sockets.on, така че този идва от тази линия тук.
Така че, аз съм просто четене на документация io.socket ми дава
достъп до така наречените WebSocket с браузър,
между браузъра и сървъра.
Слушам за специална връзка събитие, което означава,
когато потребителят първо хитове сървърът се опитва
, за да отворите тази връзка, аз съм Ще се обадя на това повикване обратно.
И сега, аз отивам да направите следното.
На всеки пет секунди това, което аз ще направя?
Отивам да излъчва или излъчва ако си спомняте нулата,
графичен език би че предаването блокове?
Така че, ти започваш да се излъчват
или да предизвика едно събитие, наречено произволно от сървър.
И това ще съдържа Ping съобщение
и текущата дата.
Така че, това е действително чат сървър, който Alice
и Боб може да използва, но това е нещо на автоматизирана сървър за чат
когато съобщенията са просто някак сонарни пинг.
Това е просто дата, на моменти, че са се изпраща на всеки пет секунди.
Така че, ако аз действително стартирате тази нещо - и това е всичко.
За да бъде ясно, тук долу, известие това е просто да влезете тук.
Така че, нека да се превърне затваряме очите за това.
Нека да направим възел на app.js.
Позволете ми да отида в моя браузър.
Презареди началната страница тук.
[Pause]
И нека ме затворят инспекторът.
На всеки пет секунди имам демонстрация въпреки че не
интерактивни за човешкото
на нещо, което е става асинхронно.
В обявлението за сваляне, че няма икона предене.
Това е използване на любител функция на Chrome в съвременните браузъри
за поддържане на контакт връзка, намираща се под капака
и това е, което се нарича обикновено кръчма / под модел,
публикува / абонирате модел, където не сме направили
че доста изрично тук.
Но това, което е хубаво за тази обща кръчма / под парадигма е
че можете да имате един издател.
В този случай централен сървър и всички
на индивида браузъри са клиенти.
Alices и Bobs НА ПРАВИТЕЛСТВАТА свят не може да се абонирате за нея,
така че можете да предават съобщения сред неограничен брой потребители.
И въпреки, че отново сме не виждам интерактивност,
имахме може би 12 линии на код, само за да направи това.
И това вероятно не е високосна да си представим, как бихте могли да привличам
от файла index.html че има истински HTML форма
малко Jquery код с Ajax, че не изпрати деня
но просто изпраща каквото и Alice или тип Боб сървъра
и след това на сървъра ще го препредава навън.
И обещавам да зърнат при едно последно нещо просто
да ви дразни с това.
Ако отидем в поток нула и едно,
ще видите код, който е просто малко по-различно тук.
Само да съм го виждал, Това е алтернатива
към това, което нарече fs.readFile метод по-рано, при което,
можете да кажете node.js: "Иди прочетете този файл в паметта.
Но ако това е голяма просто да даде ми парче в даден момент. "
И може би знаете от CS165
или 161 файлови системи имат различен
свойства изпълнение.
Може би искате да прочетете в блокове от 512 байта
или 2 килобайта или нещо такова.
Това е начин за оптимизиране на се връща на файл итеративно
така че можете да го плюят от малко по-бързо
към браузъра или да който и крайния клиент е.
Така че огромно количество съдържание днес и ние ще се потопите
в по-големи подробности в сряда с Tim [предположи правопис]
по-специално гледаш как ние може да превежда някои от идеите
от първата половина на Разбира Laravel и модели
в библиотека, която той самият пише нарича Bookshelf.js
който стана все популярния в общността
защото ви дава голямата част от него,
ако не и повече, отколкото функционалност на красноречив
който припомни, че е библиотека прозрение на Laravel,
толкова повече върху това и още как
да развиват пълноправен приложения в сряда.
Ще се видим тогава.