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