Перевірка знань по темі "Node"

1. Що таке Node.js?

Node.js — це середовище виконання JavaScript поза браузером, побудоване на V8 (движок Chrome). Воно дозволяє запускати JS на сервері.

  • Створене для масштабованих, високопродуктивних мережевих додатків.
  • Використовує подієво-орієнтовану, неблокуючу модель I/O.
  • Активно застосовується у веб-розробці, CLI-утилітах, мікросервісах.
// Перевірка версії Node.js
node -v

// Виконання JS-файлу
node app.js

Висновок: Node.js робить JavaScript універсальною мовою — і для клієнта, і для сервера.

2. Як встановити Node.js?

Існує кілька способів установки:

  • З офіційного сайту: nodejs.org
  • Через пакетні менеджери:
    • nvm (Node Version Manager) — для Unix-подібних систем.
    • choco (Chocolatey) — для Windows.
# Приклад з nvm
nvm install 20
nvm use 20

Рекомендація: Використовуй nvm для зручного перемикання між версіями Node.js.

3. Що таке REPL у Node.js?

REPL (Read–Eval–Print–Loop) — інтерактивне середовище Node.js для швидкого тестування коду.

// Запуск REPL
node

// Усередині REPL
> 2 + 2
4
> const x = 10;
> x * 2
20

Використання: зручно для експериментів, перевірки функцій без створення окремого файлу.

4. Чим Node.js відрізняється від браузерного JavaScript?
  • У браузері JS працює з DOM, подіями, localStorage.
  • У Node.js доступ до файлової системи, мережі, процесів ОС.
  • У браузері немає require/module.exports (до ES Modules).
  • Node.js — орієнтований на сервер і бекенд.
// У Node.js
const fs = require('fs');
fs.writeFileSync('test.txt', 'Привіт Node.js!');

// У браузері так зробити не можна
5. Що таке модулі в Node.js?

Модулі — це окремі файли з кодом, які можна підключати й перевикористовувати.

  • Вбудовані: fs, http, path.
  • Користувацькі: власні JS-файли.
  • Зовнішні: пакети з npm.
// example.js
module.exports = function(a, b) {
  return a + b;
}

// app.js
const add = require('./example');
console.log(add(2, 3)); // 5

Висновок: Модулі роблять код організованим і підтримуваним.

6. Як працює require та module.exports?

require() використовується для підключення модулів, module.exports — для експорту функцій чи об'єктів із модуля.

// math.js
module.exports.sum = (a, b) => a + b;

// app.js
const math = require('./math');
console.log(math.sum(3, 4)); // 7

Висновок: Це основа організації коду в Node.js.

7. Що таке глобальні об'єкти Node.js?

Node.js має власні глобальні об'єкти:

  • global — глобальний об'єкт
  • __dirname — шлях до директорії поточного файлу
  • __filename — повний шлях до файлу
  • process — інформація про процес Node.js
  • console — вивід у консоль
console.log(__dirname);
console.log(__filename);
console.log(process.platform);
8. Що таке package.json?

package.json — файл, який описує проект Node.js, його залежності, скрипти та метадані.

{
  "name": "my-app",
  "version": "1.0.0",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "^4.18.2"
  }
}

Висновок: package.json керує всіма аспектами проекту Node.js.

9. Як запускати Node.js скрипт?
// У терміналі
node app.js

// Можна передавати аргументи
node app.js arg1 arg2

// В JS
process.argv.forEach((val, index) => {
  console.log(`${index}: ${val}`);
});
10. Які типи модулів існують?
  • Вбудовані модулі: fs, http, path
  • Користувацькі модулі: ваші файли JS
  • Зовнішні модулі: встановлені через npm
11. Що таке Node Package Manager (npm)?

npm — менеджер пакетів для Node.js, що дозволяє встановлювати бібліотеки, управляти залежностями та скриптами.

// Ініціалізація npm
npm init

// Встановлення пакета
npm install express
12. Як оновити Node.js?
  • Через nvm: nvm install latest
  • Через офіційний сайт Node.js
  • Через пакетний менеджер ОС
13. Як перевірити версію Node.js і npm?
node -v
npm -v
14. Як підключати модулі ES6 в Node.js?

Node.js підтримує ES Modules за розширенням .mjs або при "type": "module" у package.json.

// sum.mjs
export const sum = (a, b) => a + b;

// app.mjs
import { sum } from './sum.mjs';
console.log(sum(3,4));
15. Що таке callback-функція?

Callback — це функція, яка передається як аргумент іншій функції для виконання після завершення операції.

const fs = require('fs');
fs.readFile('file.txt', 'utf8', (err, data) => {
  if(err) throw err;
  console.log(data);
});
16. Що таке event loop у Node.js?

Event Loop — механізм Node.js для обробки неблокуючих асинхронних операцій.

  • Node.js ставить I/O операції в чергу.
  • Event Loop перевіряє, коли операція завершена, і викликає відповідний callback.
17. Як працює require() caching?

Node.js кешує модулі після першого підключення.

// Модуль буде завантажений лише один раз
const mod1 = require('./mod');
const mod2 = require('./mod'); // поверне кешований об'єкт
18. Що таке __dirname та __filename?

__dirname — абсолютний шлях до поточної директорії.

__filename — абсолютний шлях до поточного файлу.

console.log(__dirname);
console.log(__filename);
19. Як працює process.env?

Process.env містить змінні оточення Node.js.

console.log(process.env.PORT || 3000);

Зручно для налаштування конфігурацій та секретів.

20. Що таке callback hell?

Callback hell — це занадто глибоко вкладені callback-функції, які погіршують читаність коду.

fs.readFile('file1', (err, data1) => {
  fs.readFile('file2', (err, data2) => {
    fs.readFile('file3', (err, data3) => {
      console.log(data1, data2, data3);
    });
  });
});

Висновок: Використовуй Promises або async/await для чистішого коду.

21. Як читати файли у Node.js?

Модуль fs дозволяє читати файли синхронно або асинхронно.

// Асинхронно
const fs = require('fs');
fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});

// Синхронно
const content = fs.readFileSync('example.txt', 'utf8');
console.log(content);
22. Як записувати файли у Node.js?
const fs = require('fs');

// Асинхронно
fs.writeFile('output.txt', 'Привіт Node.js!', (err) => {
  if (err) throw err;
  console.log('Файл збережено!');
});

// Синхронно
fs.writeFileSync('output.txt', 'Привіт Node.js!');
23. Як додавати та видаляти пакети через npm?
# Встановити пакет локально
npm install express

# Встановити пакет глобально
npm install -g nodemon

# Видалити пакет
npm uninstall express
24. Як переглядати встановлені пакети?
# Перегляд локальних пакетів
npm list

# Перегляд глобальних пакетів
npm list -g
25. Що таке devDependencies?

devDependencies — пакети, потрібні лише для розробки (тестування, збірки), але не для продакшн.

npm install --save-dev jest
26. Як створити новий npm проект?
mkdir my-app
cd my-app
npm init
# або швидка ініціалізація
npm init -y

Це створить файл package.json з базовими налаштуваннями проекту.

27. Як підключати модулі Node.js?
// Вбудований модуль
const fs = require('fs');

// Користувацький модуль
const helper = require('./helper.js');

// Модуль з npm
const express = require('express');
28. Як працює package-lock.json?

Файл package-lock.json фіксує точні версії залежностей, щоб проект працював однаково на всіх машинах.

29. Як перевірити наявність пакета у проекті?
npm list package-name

Повертає встановлену версію пакета або повідомляє, що пакет не встановлено.

30. Як оновлювати пакети?
# Оновити всі пакети локально
npm update

# Оновити конкретний пакет
npm install express@latest
31. Що таке fs.promises?

Node.js >= 10 підтримує проміс-базований API для fs.

const fs = require('fs').promises;

async function readFile() {
  const data = await fs.readFile('file.txt', 'utf8');
  console.log(data);
}

readFile();
32. Як перевірити доступність файлу?
const fs = require('fs');

fs.access('file.txt', fs.constants.F_OK, (err) => {
  console.log(err ? 'Файл не існує' : 'Файл існує');
});
33. Як створювати та видаляти директорії?
const fs = require('fs');

// Створити директорію
fs.mkdirSync('my-folder');

// Видалити директорію
fs.rmdirSync('my-folder');
34. Як копіювати та переміщувати файли?
const fs = require('fs');

// Копіювання
fs.copyFileSync('source.txt', 'destination.txt');

// Переміщення
fs.renameSync('old.txt', 'new.txt');
35. Що таке __dirname та process.cwd()?

__dirname — абсолютний шлях до поточної директорії файлу.

process.cwd() — робоча директорія, з якої запущено Node.js.

console.log(__dirname);
console.log(process.cwd());
36. Як видалити npm cache?
npm cache clean --force
37. Як шукати пакети в npm?
npm search express
38. Як встановлювати глобальні пакети?
npm install -g nodemon

Глобальні пакети доступні з будь-якої директорії системи.

39. Як перевірити безпеку пакета npm?
npm audit
npm audit fix

Допомагає знайти вразливості та оновити пакети безпечні версії.

40. Як створювати скрипти npm?

У package.json можна додавати власні скрипти:

{
  "scripts": {
    "start": "node app.js",
    "test": "jest"
  }
}

Запуск у терміналі: npm run start або npm run test

41. Що таке асинхронність у Node.js?

Асинхронність означає, що операції не блокують виконання коду, поки чекають на завершення I/O.

  • Node.js використовує неблокуючу модель вводу/виводу.
  • Це дозволяє обробляти багато запитів одночасно.
const fs = require('fs');

// Асинхронне читання файлу
fs.readFile('file.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});

console.log('Цей рядок виконується раніше, ніж завершиться readFile');
42. Що таке callback-функція?

Callback — це функція, передана як аргумент іншій функції, яка виконується після завершення операції.

function greet(name, callback) {
  console.log(`Hello, ${name}`);
  callback();
}

greet('Alice', () => console.log('Callback виконано!'));
43. Що таке "callback hell"?

Callback hell — це занадто глибоко вкладені callback-функції, що погіршують читаність коду.

fs.readFile('file1.txt', (err, data1) => {
  fs.readFile('file2.txt', (err, data2) => {
    fs.readFile('file3.txt', (err, data3) => {
      console.log(data1, data2, data3);
    });
  });
});

Використовуй Promises або async/await для чистішого коду.

44. Що таке Promise у Node.js?

Promise — об’єкт, який представляє результат асинхронної операції.

  • Може бути у стані pending, fulfilled або rejected.
const fs = require('fs').promises;

fs.readFile('file.txt', 'utf8')
  .then(data => console.log(data))
  .catch(err => console.error(err));
45. Як створити власний Promise?
const myPromise = new Promise((resolve, reject) => {
  const success = true;
  if (success) resolve('Успіх!');
  else reject('Помилка!');
});

myPromise
  .then(msg => console.log(msg))
  .catch(err => console.error(err));
46. Як працює async/await?

Async/await дозволяє писати асинхронний код, як синхронний, з використанням Promises.

const fs = require('fs').promises;

async function readFile() {
  try {
    const data = await fs.readFile('file.txt', 'utf8');
    console.log(data);
  } catch (err) {
    console.error(err);
  }
}

readFile();
47. Як обробляти помилки у Promises?
someAsyncFunction()
  .then(result => {
    console.log(result);
  })
  .catch(err => {
    console.error('Помилка:', err);
  });
48. Що таке Promise.all?

Promise.all дозволяє виконати кілька Promises паралельно і отримати результат лише коли всі завершаться успішно.

const p1 = Promise.resolve(1);
const p2 = Promise.resolve(2);

Promise.all([p1, p2])
  .then(results => console.log(results)); // [1,2]
49. Що таке Promise.race?

Promise.race повертає результат того Promise, який завершився першим.

const p1 = new Promise(res => setTimeout(() => res('A'), 500));
const p2 = new Promise(res => setTimeout(() => res('B'), 300));

Promise.race([p1, p2])
  .then(result => console.log(result)); // B
50. Як використовувати try/catch з async/await?
async function example() {
  try {
    const data = await fs.readFile('file.txt', 'utf8');
    console.log(data);
  } catch (err) {
    console.error('Помилка:', err);
  }
}

example();
51. Що таке асинхронні ітерації (for await)?

Можна ітерувати асинхронні об’єкти за допомогою for await...of.

async function process(items) {
  for await (const item of items) {
    console.log(item);
  }
}
52. Як відкладати виконання коду?
// setTimeout
setTimeout(() => console.log('Через 1 сек'), 1000);

// setImmediate
setImmediate(() => console.log('Виконується після I/O'));
53. Як відкладати повторювані задачі?
// setInterval
setInterval(() => console.log('Кожні 2 секунди'), 2000);
54. Що таке process.nextTick?

Виконує функцію одразу після поточного етапу Event Loop, перед чергами I/O.

process.nextTick(() => console.log('Виконано на наступному кроці Event Loop'));
55. Як створювати асинхронні функції з callback у fs?
const fs = require('fs');

fs.readFile('file.txt', 'utf8', function(err, data) {
  if (err) throw err;
  console.log(data);
});
56. Як конвертувати callback у Promise?
const fs = require('fs');
const { promisify } = require('util');

const readFileAsync = promisify(fs.readFile);

readFileAsync('file.txt', 'utf8')
  .then(data => console.log(data))
  .catch(err => console.error(err));
57. Що таке асинхронні ланцюги (chaining) у Promises?
Promise.resolve(1)
  .then(x => x + 1)
  .then(x => x * 2)
  .then(result => console.log(result)); // 4
58. Як працює Promise.allSettled?

Повертає масив всіх результатів Promises, незалежно від успіху чи помилки.

const p1 = Promise.resolve(1);
const p2 = Promise.reject('error');

Promise.allSettled([p1, p2])
  .then(results => console.log(results));
59. Що таке Promise.any?

Повертає результат першого успішного Promise, ігноруючи помилки.

const p1 = Promise.reject('err');
const p2 = Promise.resolve(2);

Promise.any([p1, p2])
  .then(result => console.log(result)); // 2
60. Як об’єднувати async/await з try/catch?
async function run() {
  try {
    const data = await fs.readFile('file.txt', 'utf8');
    console.log(data);
  } catch(err) {
    console.error('Помилка:', err);
  }
}

run();

Це найчистіший та безпечний спосіб обробки асинхронного коду в Node.js.

61. Як створити простий HTTP сервер у Node.js?
const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello, Node.js!');
});

server.listen(3000, () => {
  console.log('Сервер працює на http://localhost:3000');
});
62. Що таке Express.js?

Express.js — популярний фреймворк для Node.js, який спрощує створення серверів і маршрутизації.

const express = require('express');
const app = express();

app.get('/', (req, res) => res.send('Hello Express!'));

app.listen(3000, () => console.log('Сервер на порту 3000'));
63. Як обробляти маршрути в Express?
app.get('/about', (req, res) => {
  res.send('Про сайт');
});

app.post('/login', (req, res) => {
  res.send('Логін');
});
64. Що таке middleware в Express?

Middleware — це функції, які обробляють запити та відповіді перед маршрутом або після нього.

app.use((req, res, next) => {
  console.log(`${req.method} ${req.url}`);
  next(); // передає керування далі
});
65. Як підключати body-parser?

Для обробки JSON та форм у запитах.

const express = require('express');
const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

app.post('/submit', (req, res) => {
  console.log(req.body);
  res.send('Дані отримано');
});
66. Як обробляти статичні файли?
app.use(express.static('public'));
// Тепер файли з папки public доступні напряму
// Наприклад: /public/index.html → http://localhost:3000/index.html
67. Як обробляти помилки у middleware?
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('Щось пішло не так!');
});
68. Як створювати маршрути з параметрами?
app.get('/user/:id', (req, res) => {
  res.send(`Користувач з ID: ${req.params.id}`);
});
69. Як обробляти query-параметри?
app.get('/search', (req, res) => {
  const query = req.query.q;
  res.send(`Ви шукали: ${query}`);
});
70. Як обробляти POST-запити?
app.post('/login', (req, res) => {
  const { username, password } = req.body;
  res.send(`Логін: ${username}`);
});
71. Що таке Router в Express?

Router дозволяє розбити маршрути на модулі для кращої організації.

const router = express.Router();

router.get('/products', (req, res) => res.send('Список продуктів'));
app.use('/api', router);
// Маршрут доступний за /api/products
72. Як підключати зовнішні middleware?
const cors = require('cors');
app.use(cors()); // Дозволяє CORS для всіх маршрутів
73. Як обробляти 404 помилки?
app.use((req, res, next) => {
  res.status(404).send('Сторінку не знайдено');
});
74. Як обробляти JSON у запитах?
app.use(express.json());
app.post('/data', (req, res) => {
  console.log(req.body);
  res.send('Отримано JSON');
});
75. Як відправляти JSON у відповіді?
app.get('/user', (req, res) => {
  res.json({ name: 'Alice', age: 25 });
});
76. Як працює middleware порядок?

Middleware виконується у порядку підключення. Перший app.use → другий → маршрут → обробник помилок.

77. Як створювати власне middleware?
function logger(req, res, next) {
  console.log(`${req.method} ${req.url}`);
  next();
}

app.use(logger);
78. Як використовувати next() у middleware?

next() передає керування наступному middleware або маршруту.

app.use((req, res, next) => {
  console.log('Перший middleware');
  next();
});

app.use((req, res) => {
  res.send('Другий middleware');
});
79. Як обробляти параметри маршруту у Router?
router.get('/user/:id', (req, res) => {
  res.send(`Користувач ID: ${req.params.id}`);
});
80. Як організувати маршрути в окремих файлах?

Створюй модулі для кожного набору маршрутів:

// routes/users.js
const express = require('express');
const router = express.Router();
router.get('/', (req, res) => res.send('Користувачі'));
module.exports = router;

// app.js
const usersRouter = require('./routes/users');
app.use('/users', usersRouter);
81. Що таке буфери (Buffer) у Node.js?

Buffer — об’єкт для роботи з двійковими даними у Node.js.

const buf = Buffer.from('Hello');
console.log(buf); // <Buffer 48 65 6c 6f>
console.log(buf.toString()); // Hello
82. Як створювати readable streams?
const fs = require('fs');
const readStream = fs.createReadStream('file.txt', 'utf8');

readStream.on('data', chunk => console.log('Отримано chunk:', chunk));
readStream.on('end', () => console.log('Читання завершено'));
83. Як створювати writable streams?
const fs = require('fs');
const writeStream = fs.createWriteStream('output.txt');

writeStream.write('Привіт Node.js!\n');
writeStream.end('Завершено запис');
84. Як використовувати pipe між потоками?
const fs = require('fs');
const readStream = fs.createReadStream('file.txt');
const writeStream = fs.createWriteStream('copy.txt');

readStream.pipe(writeStream);
85. Що таке EventEmitter?

EventEmitter — клас для створення івентів та їх обробки.

const EventEmitter = require('events');
const emitter = new EventEmitter();

emitter.on('message', data => console.log('Повідомлення:', data));
emitter.emit('message', 'Привіт світе!');
86. Як створювати власні класи у Node.js?
class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  greet() {
    console.log(`Hello, I'm ${this.name}`);
  }
}

const alice = new Person('Alice', 25);
alice.greet();
87. Як успадковувати класи?
class Employee extends Person {
  constructor(name, age, position) {
    super(name, age);
    this.position = position;
  }
  work() {
    console.log(`${this.name} працює на посаді ${this.position}`);
  }
}

const bob = new Employee('Bob', 30, 'Developer');
bob.greet();
bob.work();
88. Як працювати з подіями класів?
const EventEmitter = require('events');

class MyClass extends EventEmitter {
  doSomething() {
    this.emit('done', 'Завершено!');
  }
}

const obj = new MyClass();
obj.on('done', msg => console.log(msg));
obj.doSomething();
89. Як відслідковувати memory leaks?

Використовуй process.memoryUsage() та профайлери Node.js:

console.log(process.memoryUsage());
90. Як працювати з потоками у великих файлах?

Streams дозволяють обробляти файли без завантаження всього у пам’ять.

const fs = require('fs');
const readStream = fs.createReadStream('bigfile.txt');
readStream.on('data', chunk => console.log('chunk length:', chunk.length));
91. Як шифрувати дані у Node.js?
const crypto = require('crypto');
const hash = crypto.createHash('sha256').update('password').digest('hex');
console.log(hash);
92. Як працювати з TLS/HTTPS?
const https = require('https');
const fs = require('fs');

const options = {
  key: fs.readFileSync('key.pem'),
  cert: fs.readFileSync('cert.pem')
};

https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end('Hello HTTPS!');
}).listen(443);
93. Як захищати сервер від XSS та ін’єкцій?

Використовуй пакети типу helmet та валідаторів вводу:

const helmet = require('helmet');
app.use(helmet());
94. Як обмежувати кількість запитів (rate limiting)?
const rateLimit = require('express-rate-limit');

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000,
  max: 100
});

app.use(limiter);
95. Як кешувати дані у Node.js?

Можна використовувати пам’ять, Redis або інші кеші:

const cache = new Map();
cache.set('key', 'value');
console.log(cache.get('key'));
96. Як профілювати performance?
node --inspect app.js
# Відкрити Chrome DevTools → профілювання CPU та пам’яті
97. Як працювати з child processes?
const { exec } = require('child_process');
exec('ls -la', (err, stdout, stderr) => {
  if (err) console.error(err);
  console.log(stdout);
});
98. Як обробляти uncaught exceptions?
process.on('uncaughtException', err => {
  console.error('Помилка:', err);
});
99. Як обробляти unhandledRejection?
process.on('unhandledRejection', reason => {
  console.error('Unhandled Rejection:', reason);
});
100. Як оптимізувати Node.js для високого навантаження?
  • Використовуй кластеризацію (cluster) для багатоядерних CPU.
  • Оптимізуй асинхронний код і мінімізуй блокуючі операції.
  • Використовуй кешування та CDN для статичних файлів.
  • Використовуй профайлери та моніторинг для виявлення вузьких місць.