Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- db.connect делается только один раз при инициализации, т.к. инфа хранится в кеше о каждом файле. "Приемы работы с модулями" youtube
- mk@javascript.ru вопросы по курсу
- nodemon = supervisor, nodemon пизже гораздо.
- net.server - документация про хттп сервер, events eventsemitter -
- использовать только node_modules для модулей
- clarify и trace для отладки
- netxtick гарантированно до IO рабоатет, А setimmediate не обзяательно после прочтения, может и рандомно
- нода запускаются в нсколько процессов. Операции требуют много врмени
- -------------- дз
- Логирование, модули debug и winston
- . Введение в асинхронную разработку
- . Событийный цикл, библиотека libUV
- . Таймеры, process.nextTick, ref/unref
- . Работа с файлами, модуль fs
- . Безопасный путь к файлу в fs и path
- . Потоки данных в Node.JS, fs.ReadStream
- . Writable поток ответа res, метод pipe
- . Чат через long-polling, чтение POST
- практическое задание:
- (8:45:03 PM) Ilya Kantor: в 24 есть сервер для отдачи файлов
- (8:45:28 PM) Ilya Kantor: нужно написать сервер, который при
- GET /file.zip - возвращает файл из директории public/
- (8:45:41 PM) Ilya Kantor: POST /file.zip - пишет файл в директорию public
- (8:45:48 PM) Ilya Kantor: если файл уже есть, то ошибка 409
- (8:45:59 PM) Ilya Kantor: (GET 404, если файла нет)
- (8:46:02 PM) Ilya Kantor: имя файла - любое.
- (8:46:10 PM) Ilya Kantor: вложенные пути поддерживать НЕ
- (8:46:32 PM) Ilya Kantor: имя файла указано в запросеhttps://www.evernote.com/Home.action#n=8f259c27-e076-4ab6-b68d-66c8fa8fac0c&ses=4&sh=2&sds=5&
- (8:47:07 PM) Ilya Kantor: + по хорошему, ставить файлу при GET правильный mime-тип
- ------
- со статом надо осторожней, надо проверять в POST.
- синхрноость вне дел сервера это ок и уместны, если они очень редки (если рез-т кешируется, например).
- pipe надо на двух концах обрабатывать на error\обрывы
- fstat можно не исползьовать, лучше просто хендлить ошибки pipe (ENOENT и прочее).
- дл\ бинарных данных Buffer в nodejs (
- буффер менять можно, а строку уже нельзя.
- fs open с различными флагами wx, чтобы не делать лишнюю проверку.
- utf-8 занимат 2 байт, необходимо делать highWaterMar: 9
- let filesStream = new fs.WriteStream(filePath, {flags : 'wx'});
- (8:45:51 PM) Ilya Kantor: в ilya-kantor/fs-stream/03-copy-error.js корректно обработать ошибки
- посмотреть решение задачи про сервер server.js get-post-server
- (8:50:23 PM) Ilya Kantor: 1)
- в ilya-kantor/fs-stream/03-copy-error.js корректно обработать ошибки
- 2) mocha
- например http://mherman.org/blog/2015/09/10/testing-node-js-with-mocha-and-chai/#.VlSjNd_hCHo
- https://semaphoreci.com/community/tutorials/getting-started-with-node-js-and-mocha
- дома сделать тесты для ilya-kantor/get-post-server
- mongo поставить
- -----------------------
- поток в ноде открывапется сразу при вызове!! а не только при его использовании fs = createWriteStream.
- для тесто лучше синхронные вызовы делать на файловую систему.!
- тест: iframe с сервером на странице и через parent.link.click();
- karma и selenium это фронтеенд тестирование (карма через iframe, а селениум - браузерное).
- mock-fs заглушка на фс тесты
- при работе с файлами по умолчанию буфер, а не стринг
- mz/fs модуль файловая система на промисе
- промис съедает ошибки, надо обрабатывать
- ПОЧИТАТЬ ПРОМИСЫ:
- (8:31:26 PM) Ilya Kantor: дз промисы
- https://learn.javascript.ru/promise
- http://habrahabr.ru/post/209662/
- http://habrahabr.ru/company/mailru/blog/269465/
- (8:56:03 PM) Ilya Kantor: генераторы
- (8:56:15 PM) Ilya Kantor: https://learn.javascript.ru/generator
- (8:56:20 PM) Ilya Kantor: основы mongodb
- (8:56:52 PM) Ilya Kantor: http://jsman.ru/mongo-book/
- (8:58:02 PM) Ilya Kantor: если не сделали задачи на промис на занятии - то сделать их или разобрать решения
- --- вопрос:
- 1.
- 2. зачем Promise.resolve() в качестве начала асинхронной цепочки ?
- ------------
- 12.1.2015
- нужды особо в babel нет,
- koa.js будем исползовать и они делают вторую версию, которые
- http://sql-ex.ru/
- http://www.proklondike.com/books/dbobshee/date_db_intro.html
- https://github.com/mongodb/node-mongodb-native
- подключаемся к базе толко один раз connect и дисконнектимся тоже один раз в конце,
- poolzise не надо делать большим
- http://code.runnable.com/Uz7PHe38eP4xTSaT/mongoose-embedded-schema-for-node-js
- тут в схеме массив схемы
- http://mongoosejs.com/docs/populate.html
- .populate('comments') можно захватить поля комментс, если тости ссылка на него
- сделать запрос
- post.save(function (err) {
- BlogPost.findById("565dcd00a31cd6ae8ac565cc").populate('comments').exec(function(err, post2) {
- console.log(arguments);
- });
- });
- или через колбек в finById("...", functino (err, post )) ;.
- romise.resolve просто отчка отсчета для серию промисов
- задача на промисы:
- Promise.resolve()
- .then(() => Comment.remove({}))
- .then(() => BlogPost.remove({}))
- .then(() => comment.save())
- .then(() => post.save())
- .then(() => {
- console.log(post);
- mongoose.disconnect();
- })
- переписать с использованием .co красиов
- yield = "подождать" в голове.
- вызов co это всегда промис, если ретурна нет, то promise undefined.
- koajs
- ошибка юзераская имеет поле статус
- обраотка ошибок https://github.com/iliakan/javascript-nodejs/blob/master/handlers/errorHandler/index.js
- koa-views не использовать, лучше исопльзовать шаблонные системы напрямую
- 9:13:05 PM) Ilya Kantor: дз
- (9:13:13 PM) Ilya Kantпосмотрел
- or: get-post-server для User
- (9:13:35 PM) Ilya Kantor: user: mongoose/02-intro-refactor/user
- (9:13:44 PM) Ilya Kantor: REST-сервер
- (9:13:54 PM) Ilya Kantor: GET /:id - возвращает юзера по ID (or 404)
- (9:14:01 PM) Ilya Kantor: GET /users/:id ^^
- (9:14:16 PM) Ilya Kantor: POST /users созадёт юзера (мб ошибка уникальности если емейл уже есть)
- (9:14:31 PM) Ilya Kantor: GET /users возвращает всех юзеров (JSON)
- (9:14:34 PM) Ilya Kantor: массив
- (9:14:45 PM) Ilya Kantor: DELETE /users/:id удаляет юзера с таким id
- (9:14:56 PM) Anton Frolovsky: yep
- (9:14:56 PM) Dmitrii Kanatnikov: под id имеется ввиду email ?
- (9:14:56 PM) Роман Кривоносов: да
- (9:14:57 PM) Dmitrii Solovev: на koajs?
- (9:14:57 PM) Dmitry Borisov: с формами?
- (9:14:57 PM) Ilya Kantor: тесты по желанию
- (9:14:58 PM) Руслан Пономаренко: всё в json возвращать ?
- (9:15:05 PM) Ilya Kantor: всё в JSON
- (9:15:05 PM) serge left the room.
- (9:15:08 PM) Руслан Пономаренко: понял )
- (9:15:17 PM) Денис Беляев: повторите пож, что делает return yield* next и return yield next
- (9:15:19 PM) Вера Юхина: delete - через post?
- (9:15:24 PM) Misah: А в koa есть генератор скилета?
- (9:15:26 PM) Dmitrii Solovev: это на koa делать?
- (9:15:34 PM) Anton Frolovsky left the room.
- (9:15:40 PM) Ilya Kantor: var res = yield next;
- (9:15:41 PM) Ilya Kantor: return res
- (9:15:54 PM) Ilya Kantor: СКЕЛЕТ из ilya.kantor/koa/04-app
- вопросы:
- не работает
- var foundUsers = users.find({email: userName});
- if(foundUsers == []) console.log("err");
- нода никогда не должна выводиться на клиента, только nginx или varnish, haproxy
- подключение к базе в отдельный файл mongoose.connect
- .lean вернуть обычный объект, не мангус
- syntax highlight расширение для хрома
- как обрабатывается уникальность - на уровне базы.
- var mongoose types. objectid.isvalid
- yield со зведочкой запускуает генератор и выдает все значения со звездочкой
- yiled без здезды не дает весь стек! нужно со звездой
- co(function* (){
- yield* g();
- }
- function g() {
- throw new Error ("sadas");
- }
- при вызове генератора звездочка нужна:
- со не вовлекается и стек не убивает
- делать перенаправления через router.get router.del
- this.throw возвращает ошибку и параметры передавать, его нужно использовать
- тесты должны быть взаимонезависимы
- основная ошибка: зависимые тесты, надо всегда удалять после каждого тестов.
- it.only олько один тест
- mocha/opts
- -reporter spec
- --colors
- --timeour 2000
- --require should
- --require co-mocha
- --recursive
- у роутера можно указать prefix
- (8:15:11 PM) Nikolay Kozhukharenko: на уровне роутов не нужно ставить получается. Ошибку ловим на самом верху
- uniquevalidator бросает ошибку, но не 100% надежно, лучшео шибку на уровне базы ловить.
- потоки в файловых системах могут выполняться вне try catch
- koa workshop
- ДЗ:
- (8:45:30 PM) Ilya Kantor: Чат через long-polling, чтение POST
- (8:45:39 PM) Ilya Kantor: переписать на KoaJS
- (8:45:46 PM) Ilya Kantor: (правильно!) (в koa-style!)
- разобраться в GULP
- (8:47:51 PM) Anton Frolovsky: вот тут есть http://frontender.info/
- (8:47:57 PM) Ilya Kantor: почитать http://frontender.info/gulp-grunt-whatever
- скринкаст по wepback для фронта
- (8:49:42 PM) Максим Шульга: Вот вводная чать по Gulp http://getinstance.info/articles/tools/how-to-pass-parameters-gulp/
- --------
- (8:50:48 PM) Ilya Kantor: ДЗ
- https://github.com/koajs/workshop посмотреть, можно что-то сделать
- (старое)
- (8:51:00 PM) Ilya Kantor: Чат через long-polling, чтение POST
- переписать на KoaJS
- (правильно!) (в koa-style!)
- (8:51:08 PM) Ilya Kantor: почитать http://frontender.info/gulp-grunt-whatever
- (8:51:45 PM) Ilya Kantor: сделать задачи для gulp:
- (8:51:48 PM) Ilya Kantor: 1) запуск сервера
- (8:51:51 PM) Ilya Kantor: 2) запуск тестов
- (8:51:56 PM) Ilya Kantor: 3) что-нибудь ещё по вкусу.
- 11.12.15
- koa по дефолту отдает 404 на несущ. рекесты
- для чата можно сделать и новый эвент эмиттер.
- this req on для отслеживания соеднинеия, все ПРОСТО блять (К("(((
- если генератор не кидает ошибок, то мока считает, что все норм и тест такой проходит
- вопросы:
- 1. как лучше сделать отображение ошибки при аутентификации? сейчас вот такой код:
- router.post('/login', function*(next)
- {
- yield passport.authenticate('local', {
- successRedirect: '/succ',
- failureRedirect: '/fail'
- })
- yield* next;
- })
- basic авторизация используется редко, это когда сверху поп-ап с логин\пароль.
- три возможные сигнатуры вызова в пасспорте
- ДЗ 15.12.2015:
- сокет айо это обертка вокруг сокетов, использует другой модуль engine.io, чтобы эмулировать вебсокеты там где не поддерживается <IE10
- app listen вешает на порт, не рекомендуется делат require(socket.io).listen(app.server), чтобы не вызывать реквайр много раз
- сокет айо вставялет свой бобработчик ДО всех других обработчиков, типо хак такой, чтобы все такие урлы /socket.io/* шлди в сокет.
- io.serveClient(false) отключает клиентскую часть
- современные ребята использует npm и webpack, bower is dead.
- npm и для сервера и клиента
- origins - умная вещь, вебсокеты это корссдоменная вещь и по умолчанию к сокет айо можно подключаться с любого сайта, можно ограничить io set origins
- первый запрос к io это обюычный хттп. сначала установит ьсоед через лонгполлинг, а потом уже через вебскоеты.
- сокет айо плюсы:
- он делает обертку вокруг веб-сокета, асто бывает нужно через вебсокет запустить какой-то мето дна сервере и получить ответ. обычный вебскоет есть только сенд и онмессендж, мы можем через сенд отправит запрос сокет айо за нас это сделал и айдиншник не нужнып
- есть броадкаст
- как аравильно процесс ноджс не один, у нас запущена надо в 4 процесса. например, если кто-то постит жирный жсон, пока его не распарсит сервер он не может дальше ничгео делать, чтобы не висел сервак и другие бывают ситуации. если пользователи висят на разныхпроцессах, то чтобы отправить что-нибудь всем, то использоует база данных. самая распространенная redis. на языке сокет айо называется adapter. через redis осуществяляется обмен сообщениями. нода посылает в редис сообщение, что хочу продписать на сообщения для id такого-то
- --
- socket.handshake содержит первый запрос
- сессия - перриод активности юезра. через 15 минут кука ичезает и сессия умирает.
- куку необходимо обновлять и через 4 часа пользователя выкинет и зсайта .
- rooling - при каждом заходе обновляет куку. ОБЯЗАТЕЛЬЯН НАСТРОЙКА. это koa-generic-session
- по умолчанию коа подпсиывает куки, это необзятаельно делать, но ок вроде, от ддос атак помогает.
- store это сппецаильный интерефйем который подбкчается ук кмонгузу и умеет загружать\ сохрантья ю
- плоский код - без коллбеков, в ко не надо городить колбаки
- подключать адаптер нужно если мы хотим хранить подключения не в памяти, если вы ноду запускаете в несолкьо процессов
- модуль socket.io-emitter он умеет рассылать сообщения всем сокетам с данным ID
- в session.socketIds будут айдишники всех соеднинеий для клиента .
- сессия обычно http-only кука, она недоступна для websocket
- сокет - двухсторонрние обмен данными и без пересоеднинения !
- для едининчных запросов на сервер можно использоваться обычны йAJAX .
- cookie keygrip для куки и секреты
- 22_12_2015
- файл можно получить напрямую из input'a.
- socket.io-client: клиент, ставится модуль, он позволяет общаться с сокет айо из ноды, на нем можно делать любые тесты.
- не рекомендуется исопльзовать reuquire-dir, кроме отдельных редких случаев
- архитектура и деплой:
- при разработке на ноде, ожидает ловушка: проект сначала маленький, потом он растет и затем получается много всего. нужно разбивать проект:
- 1. HVMC:
- /auth/*
- /shop/*
- /profile/*
- /frontpage/*
- все префиксы можно сделать отедлельными модулями. каждый модуль будет объявлятиь необхъодимые модели, контролелры для урлов, шаблоны, можно настроить свои стили для модууля, свой клиенсткий ЖС, свои тесты
- handlers там все эти муодли
- один модуль никогда не может залелзить в другой модуль и require('users/lib/hash.js') NONONO
- а надо require('users').hash
- это инкапсуляция, эскпортирование простого интерфейса
- чтобы не писать require('../../../users').users
- каждый модуль отдельно, приватыный препозиторий npm enterprise, тогда наши модули будут доступны из node_modules и легко можно require('users').User
- н орепозитории для больших команд, для мелких альтернативный подход:
- все запускается через gulp , linkmodules, для всех модулей делает симлинк
- есть запускальщик pm2 для запуска ноды на продакшн. основной файл ecosystem.json, что и как запускать
- max_memory_restart - если процесс неконтролируеммо увеличивается в объеме, то его надо убить и рестарить
- pm2_graceful_timeout - пм2 запусукает несолько процессов на одном порту, есои мы рестартим ноджс сервер, товозможен мягкий рестарт, без прекращения работы сервера: pm2 стартует еще один и становится 5 (4+1), и потом убивает один из существуюищх.
- server.close не убивает процесс, а прекращает получение новых и дорабаотывает существующие
- распараллеливание процессов делает pm2, нас это не волнует .
- ДЕПЛОЙЙЙЙ:::
- в репозитарии находится все, кроме генерируемых ресурсов (сборка фронта и нод модулс например)
- процесс сборки выглядит так
- это отдельная ветка, есть некий билд сервер, находится артефакт (вся сборка сайта, нод модули и все-все)
- git pull из продакшн, есть некоторые операции, которые надо при деплои осуществить, но это уже сложнее
- деплой это набор ssh операwbq
- операация сборки:
- --
- ssh build-server
- git pull origin master
- gulp build
- gulp test
- git commit
- git push origin production
- --
- операция деплоя:
- git pull origin production
- для деплоя на ноде используют некоторые
- ansible
- capistrano
- тестирование на нагрузку:
- siege
- wg/wrk на lua, нагрузочный сервер
- node --prof ./bin/server
- это запуск сервера с профилированием
- npm node-tick-processor для детального лога читаемого
- сборщик мусора не должен больше 5%
- node_modules обновлят ьне так часто, раз в месяц мб
- npmshrinkwrap пишет какие пакет, каких версий стоят
- обновление модулей это отдельная задача, несвязанная с деплоем
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement