Node.js и MS SQL Server
В прошлых лекциях мы научили Java разговаривать с базой данных «Библиотека» через JDBC. Теперь мы переходим на сторону JavaScript.
До этого момента JavaScript жил только в браузере — он делал кнопки красивыми, открывал модальные окна и проверял, правильно ли вы ввели пароль. Node.js — это технология, которая позволяет запускать JavaScript прямо на сервере, без всякого браузера.
План лекции
Сегодня мы заложим фундамент для всего блока серверной разработки.
- 1 Что такое Node.js и зачем он нужен
- 2 Установка Node.js и проверка npm
- 3">Первая программа: console.log() на сервере
- 4 Переменные: let, const и var
- 5 Функции и стрелочные функции
- 6 Массивы и объекты
- 7 Что такое npm и package.json
- 8 Асинхронность: почему сервер не ждет
- 9 Promise: «обещание» результата
- 10 async/await: пишем код как синхронный
- 11 Обработка ошибок: try...catch
- 12 Практика и домашнее задание
Что такое Node.js?
Node.js — это среда выполнения JavaScript. Простыми словами: это программа, которая берет ваш файл с кодом (например, server.js) и исполняет его прямо на компьютере, без участия Chrome или Firefox.
- JavaScript в браузере: может менять текст на сайте, слушать клики мыши, но не может лазить в файлы на вашем диске или открывать базы данных.
- Node.js на сервере: может читать любые файлы, работать с базой данных MS SQL Server, создавать свои сайты (API) и отправлять письма.
Установка Node.js
Установка занимает 2 минуты.
- Откройте сайт nodejs.org (официальный сайт, ресурс разрешен в РФ).
- Вы увидите две зеленые кнопки: LTS (Long Term Support — версия с длительной поддержкой) и Current (самая новая). Всегда скачивайте LTS. Она стабильнее.
- Запустите скачанный файл (MSI для Windows).
- Нажимайте «Далее» (Next), оставляя все галочки по умолчанию. Node.js сам пропишет себя в системные пути.
node.Проверка установки
Давайте убедимся, что всё работает. Откройте терминал:
- Windows: Нажмите Win+R, введите
cmdи нажмите Enter. - macOS: Откройте программу «Терминал».
- Linux: Нажмите Ctrl+Alt+T.
Введите команды по очереди:
Вы увидите версию, например: v20.11.1.
Вы увидите версию менеджера пакетов, например: 10.2.4.
Первая программа
Создайте на рабочем столе папку node-lesson. Внутри неё создайте файл index.js.
Откройте этот файл в любом редакторе (VS Code, Notepad++) и напишите:
Сохраните файл. Теперь в терминале зайдите в эту папку (команда cd) и выполните:
Переменные: let, const и var
Переменная — это «коробка», в которую мы кладем данные. В современном JavaScript три типа коробок:
Коробку можно менять.
Коробку нельзя менять.
Старый способ. Не используйте.
Функции
Функция — это кусочек кода, у которого есть имя. Мы можем вызвать его много раз.
Обычная функция:
Стрелочная функция (современный стандарт):
const greet = name => "Привет, " + name;Массивы и объекты
Массив — это список вещей.
Объект — это вещь с характеристиками (ключ-значение).
Что такое npm?
npm (Node Package Manager) — это «магазин приложений» для программистов. В нем миллионы готовых кусочков кода.
- package.json: «Паспорт» вашего проекта. В нем записано: «Для работы мне нужны вот эти библиотеки».
- node_modules: Папка, куда npm скачивает эти библиотеки.
Асинхронность
Это самое сложное и важное понятие в Node.js.
Синхронный код (как Java): Программа встает в очередь. Пока база данных ищет книгу, весь сервер «замерзает» и ждет. Другие пользователи не могут зайти на сайт.
Асинхронный код (как Node.js): Программа говорит базе: «Ищи книгу, а я пока пойду обслужу других 100 человек. Как найдешь — свистни».
Promise (Обещание)
Promise (от англ. «обещание») — это объект, который говорит: «Я не знаю результат сейчас, но я ОБЕЩАЮ отдать его позже».
У Promise есть три состояния:
- Pending (Ожидание): работа идет.
- Fulfilled (Выполнено): данные готовы (resolve).
- Rejected (Ошибка): что-то сломалось (reject).
async и await
Писать код через then() (цепочки промисов) неудобно. Поэтому придумали async/await. Это «сахар», который делает асинхронный код похожим на обычный.
await говорит: «Подожди здесь, пока Promise не выполнится». Но важно: пока мы ждем здесь, Node.js всё равно может обслуживать другие запросы!Обработка ошибок
В Node.js ошибки случаются постоянно: база упала, интернет пропал, файл не найден. Если их не ловить, сервер «упадет» целиком.
Используйте конструкцию try...catch:
await должен быть внутри try...catch. Это спасет ваш сервер от внезапной остановки.Подключение к MS SQL Server
В Java мы использовали драйвер mssql-jdbc. В Node.js нам нужен пакет mssql. Это «переводчик» с языка Node.js на язык MS SQL Server.
Также нам понадобится пакет dotenv. Он нужен, чтобы не писать пароль от базы данных прямо в коде (это небезопасно).
node-lesson появится папка node_modules, а в файле package.json добавятся строчки с зависимостями.Файл .env
Создайте в папке проекта файл с названием .env (точка в начале обязательна!). В нем мы спрячем настройки базы.
.env в интернет (например, на GitHub). Там лежат ваши пароли! Добавьте .env в файл .gitignore.Строка подключения
Теперь создадим файл db.js. В нем мы настроим подключение. Node.js будет читать данные из .env.
process.env — это специальная переменная Node.js, которая достает значения из файла .env.Первое подключение (async/await)
Напишем функцию, которая проверит связь с базой. Обратите внимание на async и try...catch.
node db.js. Если видите зеленую галочку — Node.js увидел вашу базу «Библиотека»!Первый SELECT
Давайте прочитаем таблицу Books. Мы используем request.query().
[{ Title: 'Война и мир', Year: 1869 }, ...]. Это те же данные, что мы получали в Java через ResultSet, но уже в формате JSON.INSERT с параметрами (безопасно)
Никогда не склеивайте SQL из строк с пользовательским вводом! Это SQL-инъекция. Используйте параметры (input()).
@Name и @Email полностью защищают от взлома. Что бы ни ввел пользователь, это будет воспринято как текст.Пул соединений (Pool)
В примере выше мы каждый раз делали sql.connect(). Это долго. В реальности мы создаем пул один раз при запуске сервера.
Теперь в других файлах мы просто берем готовый пул:
Типичные ошибки Node.js + MSSQL
Неправильный логин или пароль. Проверьте файл
.env.SQL Server не принимает подключения. Зайдите в "Диспетчер конфигурации SQL Server" и включите протокол TCP/IP.
Ошибка типов. Вы пытаетесь вставить текст в числовое поле. Проверьте
sql.Int, sql.NVarChar, sql.Date.Ошибка в асинхронности. Вы пытаетесь сделать
await внутри функции, которая не помечена как async.База «уснула» или перезагрузилась. Пул должен пересоздать соединение автоматически.
Структура проекта (рефакторинг)
Чтобы код не превратился в кашу, разделим его на части. Хороший проект выглядит так:
queries.js мы вынесем функции getBooks() и addReader(). В index.js будем только вызывать эти функции. Это называется «разделение ответственности».Итоговая программа (index.js)
Соберем всё вместе. Наш index.js теперь выглядит очень просто и понятно:
node index.js. Программа выполнит все действия по очереди и корректно завершит работу.Правила безопасного кода
Запомните эти правила — они спасут ваш сервер от взлома и падений.
- Никаких паролей в коде. Только
.env. - Только параметры в SQL. Никаких
' + userInput + '. Толькоrequest.input(). - Всегда используйте try...catch. Ошибка не должна «ронять» весь сервер.
- Закрывайте пул при завершении. Используйте
sql.close()в конце работы скрипта. - Не используйте SELECT *. Выбирайте только нужные столбцы (например,
SELECT Id, Name). - Ограничивайте пул. В
configможно указатьpool: { max: 10 }, чтобы не перегрузить базу.
input(). Обычные кавычки в строке запроса не спасут.Самостоятельные задания
Попробуйте расширить наш проект самостоятельно.
- Метод
getReaders(): Выведите всех читателей из таблицыReaders. - Метод
getLoans(): СделайтеINNER JOINмеждуLoans,BooksиReaders, чтобы показать, кто какую книгу взял. - Метод
returnBook(loanId): НапишитеUPDATE, который ставит дату возврата в таблицуLoans. - Валидация: Проверьте в
addReader(), что email содержит символ@. Если нет — киньте ошибкуthrow new Error('Неверный email'). - Центральная ошибка: Сделайте функцию
withDB(func), которая сама подключается, вызывает вашу функцию и закрывает соединение, чтобы не писатьsql.connect()в каждом файле.
UPDATE используйте метод request.execute('ИмяХранимойПроцедуры') или обычный request.query('UPDATE ...').Домашнее задание
Задания для сдачи практической работы.
- Реализуйте все 5 пунктов из «Самостоятельных заданий».
- Создайте файл
books-by-author.js. Он должен принимать имя автора из аргументов командной строки (process.argv[2]) и выводить его книги черезPreparedStatement(параметры). - Добавьте в
package.jsonскрипт"start": "node index.js", чтобы запускать программу командойnpm start. - Напишите в отчете: чем
async/awaitудобнее, чем обычные функции сthen()(приведите пример кода). - Проверьте: если в
.envнаписать неправильный пароль, программа должна выдать понятную ошибку в консоль, а не «упасть» с белым экраном.
node books-by-author.js "Лев Толстой". Внутри кода: const author = process.argv[2];Спасибо за работу!
🟨
JavaScript теперь умеет работать с базой данных!
Вы прошли путь от установки Node.js до написания безопасного кода, который читает и пишет данные в MS SQL Server. Это фундамент для создания современных сайтов (REST API).