Сейчас

Урок 1

Изучаем NodeJS.

    Node или Node.js — программная платформа, основанная на движке V8 (транслирующем JavaScript в машинный код), превращающая JavaScript из узкоспециализированного языка в язык общего назначения. Node.js добавляет возможность JavaScript взаимодействовать с устройствами ввода-вывода через свой API (написанный на C++), подключать другие внешние библиотеки, написанные на разных языках, обеспечивая вызовы к ним из JavaScript-кода. Node.js применяется преимущественно на сервере, выполняя роль веб-сервера, но есть возможность разрабатывать на Node.js и десктопные оконные приложения (при помощи NW.js, AppJS или Electron для Linux, Windows и macOS) и даже программировать микроконтроллеры (например, tessel и espruino). В основе Node.js лежит событийно-ориентированное и асинхронное (или реактивное) программирование с неблокирующим вводом/выводом.

Блок 1. Основый Node.js

1. Старт.

npm init npm install nodemon -D

2. Базовые сущности. Глобальные объекты и модули.

Объекты: __dirname __filename Импорт в nodeJS: const userExample = require('./user'); Экспорт в nodeJS: module.exports = user; 2.Импорт в nodeJS: const obj = require('./user'); console.log(obj.user); obj.sayHello(); Экспорт в nodeJS: module.exports = { user: user, sayHello(){ console.log('hello'); } };

3. Модуль PATH.

__filename // абсолютный путь к файлу. path.basename(__filename) // метод забирает название файла из абсолютного пути. path.dirname(__filename) // метод получает абсолютный путь и имя папки где находится файл. path.extname(__filename) // метод отдает расширение файла. path.parse(__filename) // массив данных path.parse(__filename).ext // обращение к конкретному виду данных path.join(__dirname, 'test', 'second.html') // метод join позволяет соеденить определить определенные строки в один путь (принимает неограниченноеколичество строк). // Первым параметром указываем путь к папке, вторым папку, третим название файла path.resolve(__dirname, 'test', 'second.html') // тут так же генирируем определенный путь к папке или файлу Больше методов PATH

4. Модуль FS. (File System)

// Создание папки (если папка создана, то выдает ошибку) const fs = require('fs'); const path = require('path'); fs.mkdir(path.join(__dirname, 'notes'), (err) => { if (err) throw err; console.log('Папка была создана'); }); // Создание нового контента и файла const fs = require('fs'); const path = require('path'); fs.writeFile(path.join(__dirname, 'notes', 'mynotes.txt'), 'Текст txt файла ', (err) => { if (err) throw err; console.log('Файл был создан'); fs.appendFile( // добавление нового контента в существующий файл path.join(__dirname, 'notes', 'mynotes.txt'), 'Новый текст txt файла', err => { if (err) throw err; console.log('Файл был изменен'); fs.readFile( // чтение указаного файла path.join(__dirname, 'notes', 'mynotes.txt'), 'utf-8', // указываем кодировку файла, чтобы норм читалось (err, data) => { if (err) throw err; console.log(data); console.log(Buffer.from(data).toString()); // указываем параметры файла, чтобы читалось } ); } ) } ); // Переименование файла fs.rename( path.join(__dirname, 'notes', 'mynotes.txt'), path.join(__dirname, 'notes', 'notes.txt'), err => { if (err) throw err; console.log('Файл переиминован'); } ); Больше методов File System

5. Модуль OS. (Operation System)

const os = require ('os'); // Платформа console.log(os.platform()); // Архетиктура console.log(os.arch()); // Информация console.log(os.cpus()); // Свободной памяти console.log(os.freemem()); // Сколько всего памяти console.log(os.totalmem()); // Корневая директория console.log(os.homedir()); // Скольеко система работатет console.log(os.uptime());

6. Модуль Events.

// Модуль Events, позволяющий нам работать и добавлять eventEmitter к приложению // EventEmitter - представляет собой основной объект реализующий работу с событиями в Node const EventEmitter = require('events'); d class Logger extends EventEmitter { log(message) { // log - это метод this.emit('message', `${message} ${Date.now()}`) // Функция .emit — отвечает за диспетчеризацию событий конкретного типа //первым параметром в эмит мы передаем название того события, которые мы хотим за сабмитить, вторым параметром передаем данные, которые хотим передать } } const logger = new Logger(); // прослушка события: logger.on('message', data => { // Функция .on отвечает за прослушивание события конкретного типа console.log(data); }); logger.log('Hello'); logger.log('Hello'); // каждый раз вызывая метод log, мы вызываем метод init // По итогу получаем: // Hello 1580563003589 // где 1580563003589 - тайм штамп. // Итого, что нам нужно по итогу понимать: // нам нужно понимать базовый концепт который был описан выше и важно понимать, что очень многие классы, которые мы будем использовать в будущем, они являются наследниками от EventEmitter'a и поэтому у них можно и эмитить и прослушивать определенные события.

7. Модуль HTTP.

Встроенный модуль HTTP - позволяет создавать свои собственные HTTP сервера. const http = require ('http'); const server = http.createServer((req, res) => { console.log(req.url); res.write(`<h1>Hello from NodeJs</h1>`); res.write(`<h2>Hello from NodeJs</h2>`); res.write(`<h3>Hello from NodeJs</h3>`); res.end(` <div style="background: red; width: 200px; height: 200px"> <h1>Test</h1> </div> `) }); server.listen(3000, () => { console.log('Nice! Server is running'); }); Console:
Nice! Server is running
/
/favicon.ico


Result:

Hello from NodeJs

Hello from NodeJs

Hello from NodeJs

Test

Nodemon.

Nodemon - исполььзуется для улучшения процесса разработки и для того, чтобы не перезапускать сервер постоянно при каких-то изменениях. Добавляем строки в package. json: "start": "node index.js", "dev": "nodemon index.js"

Создание простого Web-сервера.

<script> const http = require('http'); const path = require('path'); const fs = require('fs'); const server = http.createServer((req, res) => { if (req.method === 'GET') { res.writeHead(200, { // Метод writeHead, который принимает 2 значения: код ответа сервера (http статус) и объект с ключем значения хедеров, в нашем случае - 'Content-Type': 'text/html' 'Content-Type': 'text/html; charset=utf-8' }); if (req.url === '/') { fs.readFile( path.join(__dirname, 'views', 'index.html'), 'utf-8', (err, content) => { if (err) { throw err } res.end(content) } ) } else if (req.url === '/about') { fs.readFile( path.join(__dirname, 'views', 'about.html'), 'utf-8', (err, content) => { if (err) { throw err } res.end(content) } ) } else if(req.url === '/api/users') { // по ссылке /api/users отдаем JSON файл со значениями ниже. res.writeHead(200, { 'Content-Type': 'text/json' }); const users = [ {name: 'Andrew', age: 27}, {name: 'OneGirl', age: 24}, {name: 'SecondGirl', age: 23}, {name: 'ThirdGirl', age: 25}, ]; res.end(JSON.stringify(users)) } } else if (req.method === 'POST') { const body = []; // создаем массив бади res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); // Те параметры, которые улетают из формы, они в действительности являются буферами, и делается это для того, чтобы также оптимизировать размер ходячих параметров. ТО ЕСТЬ, например, если мы отправляем какой-то файл, который будет весить 10 или 100 мб, то процесс передачи будет очень долгим, поэтому, для оптимизации мы делим все на чанки и буферируем определенные параметры. ПОЭТОМУ, данные нам поступают порциями, которые нам необходимо обработать. Для этого обращаемся к полю request и методу on: req.on('data', data => { // data - это буфер и тут мы прослушиваем это событие body.push(Buffer.from(data)) // обращаемся к массиву body и вызываем в него метод push, куда мы передаем обработанный буфер. // Тут в итоге мыполуаем буффер, который является массивом. }); req.on('end', () => { const message = body.toString().split('=')[1]; // при помощи метода split разделяем на массив по символу "-" и забераем второй элемент. Только после этого мы можем обратиться с объекту response res.end(` <h1>Ваше сообщение: ${message}</h1> `) }); } }); server.listen(3000, () => { console.log('Nice! Server is running'); }); // Где: // if (req.method === 'GET') { // если запрос, который отдает пользователь, совпадает с значением 'GET', то это означает, что мы здесь просто загрузили страницу. // res.end - нужен обязательно в конце (в него можно добавить html code) // Есть 2 разных метода указания Content-Type при помощт NodeJS (это необходимо для того, чтобы все браузеры корректно отображали страницу): // 1. Метод writeHead, который принимает 2 значения: код ответа сервера (http статус) и объект с ключем значения хедеров, в нашем случае - 'Content-Type': 'text/html' // Те параметры, которые улетают из формы, они в действительности являются буферами, и делается это для того, чтобы также оптимизировать размер ходячих параметров. ТО ЕСТЬ, например, если мы отправляем какой-то файл, который будет весить 10 или 100 мб, то процесс передачи будет очень долгим, поэтому, для оптимизации мы делим все на чанки и буферируем определенные параметры. ПОЭТОМУ, данные нам поступают порциями, которые нам необходимо обработать. Для этого обращаемся к полю request и методу on: </script>

Работа с консолью.

<script> console.log(process.argv); // если в консоле мы вобъем: node console.js messafe=hello test, то получим: /* [ '/usr/local/bin/node', '/Users/andrejsokolenko/PhpstormProjects/JsProjects/NodeJs-App/console.js', 'messafe=hello', 'test' ] */ // После чего сможем взоемодействовать с теми параметрами, которые у нас есть. function consoleToJSON() { // создаем функцию const c = {}; for (let i = 2; i < process.argv.length; i++) { const arg = process.argv[i].split('='); c[arg[0]] = arg[1] ? arg[1] : true // существует конвенция, что если мы передаем какой-либо пустой параметр без значение, то это означет, что это boolean значение (true или false), но так как значение передается, то это соответственно значение true } return c } console.log(consoleToJSON()); // если в консоле мы вобъем: node console.js test </script>

Блок 2. Практика Express.js.

Настройка приложения