Advertisement
monkk

qwe

Feb 19th, 2017
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.89 KB | None | 0 0
  1. db.connect делается только один раз при инициализации, т.к. инфа хранится в кеше о каждом файле. "Приемы работы с модулями" youtube
  2.  
  3.  
  4. mk@javascript.ru вопросы по курсу
  5.  
  6.  
  7. nodemon = supervisor, nodemon пизже гораздо.
  8.  
  9. net.server - документация про хттп сервер, events eventsemitter -
  10.  
  11. использовать только node_modules для модулей
  12.  
  13. clarify и trace для отладки
  14.  
  15. netxtick гарантированно до IO рабоатет, А setimmediate не обзяательно после прочтения, может и рандомно
  16.  
  17.  
  18. нода запускаются в нсколько процессов. Операции требуют много врмени
  19.  
  20. -------------- дз
  21.  
  22. Логирование, модули debug и winston
  23.  
  24.  
  25. . Введение в асинхронную разработку
  26.  
  27.  
  28. . Событийный цикл, библиотека libUV
  29.  
  30.  
  31. . Таймеры, process.nextTick, ref/unref
  32.  
  33.  
  34. . Работа с файлами, модуль fs
  35.  
  36.  
  37. . Безопасный путь к файлу в fs и path
  38.  
  39.  
  40. . Потоки данных в Node.JS, fs.ReadStream
  41.  
  42.  
  43. . Writable поток ответа res, метод pipe
  44.  
  45.  
  46. . Чат через long-polling, чтение POST
  47.  
  48.  
  49. практическое задание:
  50.  
  51. (8:45:03 PM) Ilya Kantor: в 24 есть сервер для отдачи файлов
  52.  
  53. (8:45:28 PM) Ilya Kantor: нужно написать сервер, который при
  54.  
  55. GET /file.zip - возвращает файл из директории public/
  56.  
  57. (8:45:41 PM) Ilya Kantor: POST /file.zip - пишет файл в директорию public
  58.  
  59.  
  60. (8:45:48 PM) Ilya Kantor: если файл уже есть, то ошибка 409
  61.  
  62. (8:45:59 PM) Ilya Kantor: (GET 404, если файла нет)
  63.  
  64. (8:46:02 PM) Ilya Kantor: имя файла - любое.
  65.  
  66. (8:46:10 PM) Ilya Kantor: вложенные пути поддерживать НЕ
  67.  
  68. (8:46:32 PM) Ilya Kantor: имя файла указано в запросеhttps://www.evernote.com/Home.action#n=8f259c27-e076-4ab6-b68d-66c8fa8fac0c&ses=4&sh=2&sds=5&
  69.  
  70. (8:47:07 PM) Ilya Kantor: + по хорошему, ставить файлу при GET правильный mime-тип
  71.  
  72.  
  73. ------
  74.  
  75. со статом надо осторожней, надо проверять в POST.
  76.  
  77. синхрноость вне дел сервера это ок и уместны, если они очень редки (если рез-т кешируется, например).
  78.  
  79. pipe надо на двух концах обрабатывать на error\обрывы
  80.  
  81. fstat можно не исползьовать, лучше просто хендлить ошибки pipe (ENOENT и прочее).
  82. дл\ бинарных данных Buffer в nodejs (
  83.  
  84.  
  85. буффер менять можно, а строку уже нельзя.
  86.  
  87. fs open с различными флагами wx, чтобы не делать лишнюю проверку.
  88.  
  89. utf-8 занимат 2 байт, необходимо делать highWaterMar: 9
  90. let filesStream = new fs.WriteStream(filePath, {flags : 'wx'});
  91.  
  92. (8:45:51 PM) Ilya Kantor: в ilya-kantor/fs-stream/03-copy-error.js корректно обработать ошибки
  93.  
  94.  
  95. посмотреть решение задачи про сервер server.js get-post-server
  96. (8:50:23 PM) Ilya Kantor: 1)
  97.  
  98. в ilya-kantor/fs-stream/03-copy-error.js корректно обработать ошибки
  99.  
  100. 2) mocha
  101.  
  102. например http://mherman.org/blog/2015/09/10/testing-node-js-with-mocha-and-chai/#.VlSjNd_hCHo
  103.  
  104. https://semaphoreci.com/community/tutorials/getting-started-with-node-js-and-mocha
  105.  
  106. дома сделать тесты для ilya-kantor/get-post-server
  107.  
  108.  
  109. mongo поставить
  110.  
  111. -----------------------
  112.  
  113. поток в ноде открывапется сразу при вызове!! а не только при его использовании fs = createWriteStream.
  114.  
  115. для тесто лучше синхронные вызовы делать на файловую систему.!
  116.  
  117. тест: iframe с сервером на странице и через parent.link.click();
  118.  
  119. karma и selenium это фронтеенд тестирование (карма через iframe, а селениум - браузерное).
  120.  
  121. mock-fs заглушка на фс тесты
  122.  
  123. при работе с файлами по умолчанию буфер, а не стринг
  124.  
  125. mz/fs модуль файловая система на промисе
  126.  
  127. промис съедает ошибки, надо обрабатывать
  128.  
  129.  
  130. ПОЧИТАТЬ ПРОМИСЫ:
  131.  
  132.  
  133. (8:31:26 PM) Ilya Kantor: дз промисы
  134.  
  135. https://learn.javascript.ru/promise
  136.  
  137. http://habrahabr.ru/post/209662/
  138.  
  139. http://habrahabr.ru/company/mailru/blog/269465/
  140.  
  141. (8:56:03 PM) Ilya Kantor: генераторы
  142.  
  143. (8:56:15 PM) Ilya Kantor: https://learn.javascript.ru/generator
  144.  
  145. (8:56:20 PM) Ilya Kantor: основы mongodb
  146.  
  147. (8:56:52 PM) Ilya Kantor: http://jsman.ru/mongo-book/
  148.  
  149.  
  150. (8:58:02 PM) Ilya Kantor: если не сделали задачи на промис на занятии - то сделать их или разобрать решения
  151.  
  152.  
  153.  
  154. --- вопрос:
  155.  
  156. 1.
  157.  
  158. 2. зачем Promise.resolve() в качестве начала асинхронной цепочки ?
  159.  
  160.  
  161.  
  162. ------------
  163. 12.1.2015
  164.  
  165. нужды особо в babel нет,
  166.  
  167. koa.js будем исползовать и они делают вторую версию, которые
  168.  
  169. http://sql-ex.ru/
  170.  
  171. http://www.proklondike.com/books/dbobshee/date_db_intro.html
  172.  
  173.  
  174. https://github.com/mongodb/node-mongodb-native
  175.  
  176.  
  177. подключаемся к базе толко один раз connect и дисконнектимся тоже один раз в конце,
  178.  
  179. poolzise не надо делать большим
  180.  
  181. http://code.runnable.com/Uz7PHe38eP4xTSaT/mongoose-embedded-schema-for-node-js
  182.  
  183.  
  184. тут в схеме массив схемы
  185. http://mongoosejs.com/docs/populate.html
  186.  
  187.  
  188. .populate('comments') можно захватить поля комментс, если тости ссылка на него
  189.  
  190. сделать запрос
  191.  
  192. post.save(function (err) {
  193.  
  194. BlogPost.findById("565dcd00a31cd6ae8ac565cc").populate('comments').exec(function(err, post2) {
  195.  
  196. console.log(arguments);
  197.  
  198. });
  199.  
  200. });
  201.  
  202. или через колбек в finById("...", functino (err, post )) ;.
  203.  
  204. romise.resolve просто отчка отсчета для серию промисов
  205.  
  206. задача на промисы:
  207.  
  208. Promise.resolve()
  209.  
  210. .then(() => Comment.remove({}))
  211.  
  212. .then(() => BlogPost.remove({}))
  213.  
  214. .then(() => comment.save())
  215.  
  216. .then(() => post.save())
  217.  
  218. .then(() => {
  219.  
  220. console.log(post);
  221.  
  222. mongoose.disconnect();
  223.  
  224. })
  225.  
  226. переписать с использованием .co красиов
  227.  
  228. yield = "подождать" в голове.
  229.  
  230. вызов co это всегда промис, если ретурна нет, то promise undefined.
  231.  
  232. koajs
  233.  
  234. ошибка юзераская имеет поле статус
  235.  
  236. обраотка ошибок https://github.com/iliakan/javascript-nodejs/blob/master/handlers/errorHandler/index.js
  237.  
  238.  
  239. koa-views не использовать, лучше исопльзовать шаблонные системы напрямую
  240.  
  241.  
  242. 9:13:05 PM) Ilya Kantor: дз
  243.  
  244. (9:13:13 PM) Ilya Kantпосмотрел
  245. or: get-post-server для User
  246.  
  247. (9:13:35 PM) Ilya Kantor: user: mongoose/02-intro-refactor/user
  248.  
  249. (9:13:44 PM) Ilya Kantor: REST-сервер
  250.  
  251. (9:13:54 PM) Ilya Kantor: GET /:id - возвращает юзера по ID (or 404)
  252.  
  253. (9:14:01 PM) Ilya Kantor: GET /users/:id ^^
  254.  
  255. (9:14:16 PM) Ilya Kantor: POST /users созадёт юзера (мб ошибка уникальности если емейл уже есть)
  256.  
  257. (9:14:31 PM) Ilya Kantor: GET /users возвращает всех юзеров (JSON)
  258.  
  259. (9:14:34 PM) Ilya Kantor: массив
  260.  
  261. (9:14:45 PM) Ilya Kantor: DELETE /users/:id удаляет юзера с таким id
  262.  
  263. (9:14:56 PM) Anton Frolovsky: yep
  264.  
  265. (9:14:56 PM) Dmitrii Kanatnikov: под id имеется ввиду email ?
  266.  
  267. (9:14:56 PM) Роман Кривоносов: да
  268.  
  269. (9:14:57 PM) Dmitrii Solovev: на koajs?
  270.  
  271. (9:14:57 PM) Dmitry Borisov: с формами?
  272.  
  273. (9:14:57 PM) Ilya Kantor: тесты по желанию
  274.  
  275. (9:14:58 PM) Руслан Пономаренко: всё в json возвращать ?
  276.  
  277. (9:15:05 PM) Ilya Kantor: всё в JSON
  278.  
  279. (9:15:05 PM) serge left the room.
  280.  
  281. (9:15:08 PM) Руслан Пономаренко: понял )
  282.  
  283. (9:15:17 PM) Денис Беляев: повторите пож, что делает return yield* next и return yield next
  284.  
  285. (9:15:19 PM) Вера Юхина: delete - через post?
  286.  
  287. (9:15:24 PM) Misah: А в koa есть генератор скилета?
  288.  
  289. (9:15:26 PM) Dmitrii Solovev: это на koa делать?
  290.  
  291. (9:15:34 PM) Anton Frolovsky left the room.
  292.  
  293. (9:15:40 PM) Ilya Kantor: var res = yield next;
  294.  
  295. (9:15:41 PM) Ilya Kantor: return res
  296.  
  297. (9:15:54 PM) Ilya Kantor: СКЕЛЕТ из ilya.kantor/koa/04-app
  298.  
  299.  
  300. вопросы:
  301.  
  302.  
  303. не работает
  304.  
  305. var foundUsers = users.find({email: userName});
  306.  
  307. if(foundUsers == []) console.log("err");
  308.  
  309.  
  310. нода никогда не должна выводиться на клиента, только nginx или varnish, haproxy
  311.  
  312. подключение к базе в отдельный файл mongoose.connect
  313.  
  314. .lean вернуть обычный объект, не мангус
  315.  
  316.  
  317. syntax highlight расширение для хрома
  318.  
  319. как обрабатывается уникальность - на уровне базы.
  320.  
  321.  
  322. var mongoose types. objectid.isvalid
  323.  
  324. yield со зведочкой запускуает генератор и выдает все значения со звездочкой
  325.  
  326. yiled без здезды не дает весь стек! нужно со звездой
  327.  
  328. co(function* (){
  329. yield* g();
  330. }
  331.  
  332. function g() {
  333. throw new Error ("sadas");
  334. }
  335.  
  336. при вызове генератора звездочка нужна:
  337.  
  338. со не вовлекается и стек не убивает
  339.  
  340. делать перенаправления через router.get router.del
  341.  
  342. this.throw возвращает ошибку и параметры передавать, его нужно использовать
  343.  
  344. тесты должны быть взаимонезависимы
  345.  
  346. основная ошибка: зависимые тесты, надо всегда удалять после каждого тестов.
  347.  
  348. it.only олько один тест
  349.  
  350. mocha/opts
  351.  
  352. -reporter spec
  353. --colors
  354. --timeour 2000
  355. --require should
  356.  
  357. --require co-mocha
  358. --recursive
  359.  
  360. у роутера можно указать prefix
  361.  
  362. (8:15:11 PM) Nikolay Kozhukharenko: на уровне роутов не нужно ставить получается. Ошибку ловим на самом верху
  363.  
  364.  
  365. uniquevalidator бросает ошибку, но не 100% надежно, лучшео шибку на уровне базы ловить.
  366.  
  367. потоки в файловых системах могут выполняться вне try catch
  368.  
  369. koa workshop
  370.  
  371. ДЗ:
  372.  
  373. (8:45:30 PM) Ilya Kantor: Чат через long-polling, чтение POST
  374.  
  375. (8:45:39 PM) Ilya Kantor: переписать на KoaJS
  376.  
  377. (8:45:46 PM) Ilya Kantor: (правильно!) (в koa-style!)
  378.  
  379. разобраться в GULP
  380. (8:47:51 PM) Anton Frolovsky: вот тут есть http://frontender.info/
  381.  
  382. (8:47:57 PM) Ilya Kantor: почитать http://frontender.info/gulp-grunt-whatever
  383.  
  384.  
  385. скринкаст по wepback для фронта
  386. (8:49:42 PM) Максим Шульга: Вот вводная чать по Gulp http://getinstance.info/articles/tools/how-to-pass-parameters-gulp/
  387.  
  388.  
  389. --------
  390.  
  391. (8:50:48 PM) Ilya Kantor: ДЗ
  392.  
  393. https://github.com/koajs/workshop посмотреть, можно что-то сделать
  394.  
  395. (старое)
  396.  
  397. (8:51:00 PM) Ilya Kantor: Чат через long-polling, чтение POST
  398.  
  399. переписать на KoaJS
  400.  
  401. (правильно!) (в koa-style!)
  402.  
  403. (8:51:08 PM) Ilya Kantor: почитать http://frontender.info/gulp-grunt-whatever
  404.  
  405. (8:51:45 PM) Ilya Kantor: сделать задачи для gulp:
  406.  
  407. (8:51:48 PM) Ilya Kantor: 1) запуск сервера
  408.  
  409. (8:51:51 PM) Ilya Kantor: 2) запуск тестов
  410.  
  411. (8:51:56 PM) Ilya Kantor: 3) что-нибудь ещё по вкусу.
  412.  
  413.  
  414. 11.12.15
  415.  
  416.  
  417. koa по дефолту отдает 404 на несущ. рекесты
  418.  
  419.  
  420. для чата можно сделать и новый эвент эмиттер.
  421.  
  422.  
  423. this req on для отслеживания соеднинеия, все ПРОСТО блять (К("(((
  424.  
  425.  
  426. если генератор не кидает ошибок, то мока считает, что все норм и тест такой проходит
  427.  
  428.  
  429.  
  430.  
  431. вопросы:
  432.  
  433.  
  434. 1. как лучше сделать отображение ошибки при аутентификации? сейчас вот такой код:
  435.  
  436.  
  437. router.post('/login', function*(next)
  438.  
  439. {
  440.  
  441. yield passport.authenticate('local', {
  442.  
  443. successRedirect: '/succ',
  444.  
  445. failureRedirect: '/fail'
  446.  
  447. })
  448.  
  449.  
  450. yield* next;
  451.  
  452. })
  453.  
  454.  
  455.  
  456.  
  457. basic авторизация используется редко, это когда сверху поп-ап с логин\пароль.
  458.  
  459. три возможные сигнатуры вызова в пасспорте
  460.  
  461. ДЗ 15.12.2015:
  462.  
  463. сокет айо это обертка вокруг сокетов, использует другой модуль engine.io, чтобы эмулировать вебсокеты там где не поддерживается <IE10
  464.  
  465. app listen вешает на порт, не рекомендуется делат require(socket.io).listen(app.server), чтобы не вызывать реквайр много раз
  466.  
  467. сокет айо вставялет свой бобработчик ДО всех других обработчиков, типо хак такой, чтобы все такие урлы /socket.io/* шлди в сокет.
  468.  
  469. io.serveClient(false) отключает клиентскую часть
  470.  
  471. современные ребята использует npm и webpack, bower is dead.
  472.  
  473. npm и для сервера и клиента
  474.  
  475. origins - умная вещь, вебсокеты это корссдоменная вещь и по умолчанию к сокет айо можно подключаться с любого сайта, можно ограничить io set origins
  476.  
  477. первый запрос к io это обюычный хттп. сначала установит ьсоед через лонгполлинг, а потом уже через вебскоеты.
  478.  
  479. сокет айо плюсы:
  480.  
  481. он делает обертку вокруг веб-сокета, асто бывает нужно через вебсокет запустить какой-то мето дна сервере и получить ответ. обычный вебскоет есть только сенд и онмессендж, мы можем через сенд отправит запрос сокет айо за нас это сделал и айдиншник не нужнып
  482.  
  483. есть броадкаст
  484.  
  485. как аравильно процесс ноджс не один, у нас запущена надо в 4 процесса. например, если кто-то постит жирный жсон, пока его не распарсит сервер он не может дальше ничгео делать, чтобы не висел сервак и другие бывают ситуации. если пользователи висят на разныхпроцессах, то чтобы отправить что-нибудь всем, то использоует база данных. самая распространенная redis. на языке сокет айо называется adapter. через redis осуществяляется обмен сообщениями. нода посылает в редис сообщение, что хочу продписать на сообщения для id такого-то
  486.  
  487. --
  488.  
  489. socket.handshake содержит первый запрос
  490.  
  491. сессия - перриод активности юезра. через 15 минут кука ичезает и сессия умирает.
  492. куку необходимо обновлять и через 4 часа пользователя выкинет и зсайта .
  493.  
  494. rooling - при каждом заходе обновляет куку. ОБЯЗАТЕЛЬЯН НАСТРОЙКА. это koa-generic-session
  495.  
  496. по умолчанию коа подпсиывает куки, это необзятаельно делать, но ок вроде, от ддос атак помогает.
  497.  
  498. store это сппецаильный интерефйем который подбкчается ук кмонгузу и умеет загружать\ сохрантья ю
  499.  
  500. плоский код - без коллбеков, в ко не надо городить колбаки
  501.  
  502. подключать адаптер нужно если мы хотим хранить подключения не в памяти, если вы ноду запускаете в несолкьо процессов
  503.  
  504. модуль socket.io-emitter он умеет рассылать сообщения всем сокетам с данным ID
  505.  
  506. в session.socketIds будут айдишники всех соеднинеий для клиента .
  507.  
  508. сессия обычно http-only кука, она недоступна для websocket
  509.  
  510. сокет - двухсторонрние обмен данными и без пересоеднинения !
  511.  
  512. для едининчных запросов на сервер можно использоваться обычны йAJAX .
  513.  
  514. cookie keygrip для куки и секреты
  515.  
  516. 22_12_2015
  517.  
  518. файл можно получить напрямую из input'a.
  519.  
  520. socket.io-client: клиент, ставится модуль, он позволяет общаться с сокет айо из ноды, на нем можно делать любые тесты.
  521.  
  522. не рекомендуется исопльзовать reuquire-dir, кроме отдельных редких случаев
  523.  
  524. архитектура и деплой:
  525.  
  526. при разработке на ноде, ожидает ловушка: проект сначала маленький, потом он растет и затем получается много всего. нужно разбивать проект:
  527.  
  528.  
  529. 1. HVMC:
  530.  
  531.  
  532. /auth/*
  533. /shop/*
  534. /profile/*
  535. /frontpage/*
  536.  
  537. все префиксы можно сделать отедлельными модулями. каждый модуль будет объявлятиь необхъодимые модели, контролелры для урлов, шаблоны, можно настроить свои стили для модууля, свой клиенсткий ЖС, свои тесты
  538.  
  539. handlers там все эти муодли
  540.  
  541. один модуль никогда не может залелзить в другой модуль и require('users/lib/hash.js') NONONO
  542.  
  543. а надо require('users').hash
  544.  
  545. это инкапсуляция, эскпортирование простого интерфейса
  546.  
  547. чтобы не писать require('../../../users').users
  548.  
  549. каждый модуль отдельно, приватыный препозиторий npm enterprise, тогда наши модули будут доступны из node_modules и легко можно require('users').User
  550.  
  551. н орепозитории для больших команд, для мелких альтернативный подход:
  552.  
  553. все запускается через gulp , linkmodules, для всех модулей делает симлинк
  554.  
  555. есть запускальщик pm2 для запуска ноды на продакшн. основной файл ecosystem.json, что и как запускать
  556.  
  557. max_memory_restart - если процесс неконтролируеммо увеличивается в объеме, то его надо убить и рестарить
  558.  
  559. pm2_graceful_timeout - пм2 запусукает несолько процессов на одном порту, есои мы рестартим ноджс сервер, товозможен мягкий рестарт, без прекращения работы сервера: pm2 стартует еще один и становится 5 (4+1), и потом убивает один из существуюищх.
  560.  
  561. server.close не убивает процесс, а прекращает получение новых и дорабаотывает существующие
  562.  
  563. распараллеливание процессов делает pm2, нас это не волнует .
  564.  
  565.  
  566. ДЕПЛОЙЙЙЙ:::
  567.  
  568. в репозитарии находится все, кроме генерируемых ресурсов (сборка фронта и нод модулс например)
  569.  
  570. процесс сборки выглядит так
  571.  
  572. это отдельная ветка, есть некий билд сервер, находится артефакт (вся сборка сайта, нод модули и все-все)
  573. git pull из продакшн, есть некоторые операции, которые надо при деплои осуществить, но это уже сложнее
  574.  
  575. деплой это набор ssh операwbq
  576. операация сборки:
  577. --
  578. ssh build-server
  579. git pull origin master
  580. gulp build
  581. gulp test
  582. git commit
  583. git push origin production
  584. --
  585. операция деплоя:
  586.  
  587. git pull origin production
  588.  
  589. для деплоя на ноде используют некоторые
  590.  
  591. ansible
  592. capistrano
  593.  
  594. тестирование на нагрузку:
  595.  
  596. siege
  597. wg/wrk на lua, нагрузочный сервер
  598.  
  599.  
  600. node --prof ./bin/server
  601.  
  602. это запуск сервера с профилированием
  603.  
  604. npm node-tick-processor для детального лога читаемого
  605.  
  606. сборщик мусора не должен больше 5%
  607.  
  608. node_modules обновлят ьне так часто, раз в месяц мб
  609.  
  610. npmshrinkwrap пишет какие пакет, каких версий стоят
  611.  
  612. обновление модулей это отдельная задача, несвязанная с деплоем
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement