Створюємо сервер на EXPRESS JS для статичного веб-сайту
Зміст: Мінімум що треба для роботи серверу, корисні бібліотеки
Сервер необхідний для обробки http-запитів, щоб можна було передавати дані форм через мережу інтернет, наприклад, на віддалену базу даних

Мінімум що треба для роботи серверу

0. node.js - скачати і встановити останню версію node.js
1. npm init -y - в кореневому каталозі проекту ініціалізувати створення файлу конфігурації проекту
в результаті створиться файл package.json
2.1. server.js - створити файл серверу
2.2. .env - створити файл .env для зберігання приватних даних (номер порту, посилання на базу даних і т.п.)
3. npm i express mongoose - встановити бібліотеки express для створення серверу i mongoose для роботи з БД MongoDB;
в папкі проекту створиться каталог "node_modules", куди будуть завантажуватися всі бібліотеки
Текст коду серверу
1. const express = require('express'); const mongoose = require('mongoose'); - підключаємо бібліотеки
2. const port = process.env.PORT || 3000; - об'явити змінну порту; номер порту зберігається у файлі .env в корені проекту
const db_url = process.env.DB_URL; - об'явити змінну посилання на БД; змінна теж зберігається в файлі .env
const path = require('path'); - ця змінна необхідна для отримання запитів зі статичних сайтів
3. const app = express(); - створюємо об'єкт серверу
4. app.use(express.static(__dirname)); app.use(express.static(path.join(__dirname, "shpory/web"))); - задаємо серверу отримувати запити із статичних веб-сторінок кореневого каталогу і дочірнього каталогу
5. app.use(express.urlencoded({extended:true})); - middleware для обробки form-urlencoded; це потрібно для отримання корректних даних із форм
6. app.listen(port, () => { console.log(`Server is running on port ${port}`); }); - запуск серверу
7. app.get('/post', (req,res) => { try { console.log(req); res.send('Дані форми отримані') } catch (error) { console.log(error); } }); - отримуємо дані із форми, що знаходиться у вищезазначеному дочірньому каталозі
8. mongoose.connect(db_url); const db = mongoose.connection; db.once('open', () =>{ console.log('MongoDB connection successful'); }); - підключаємося до БД
9. const userSchema = new mongoose.Schema({ username:String }); - об'являємо схему для запису в ДБ, в ній звертаємося до полів форми по імені "name" і задаємо формат отриманих даних
const Users = mongoose.model("users",userSchema); - створюємо клас для ДБ, в якому вказуємо колекцію і дані
10. app.post('/post', async (req,res) =>{ try { const {username} = req.body; const user = new Users({ username }); await user.save(); console.log(`${user} is created`); res.send(`New ${user} is created`); console.log(req.body); } catch (error) { console.log(error); } }); - записуємо дані із полів форми, звертаючись до них по імені name, у створений об'єкт і зберігаємо об'єкт у БД
Структура створеного проекту:

Корисні бібліотеки

require('nodemon') - автоматично перезавантажує сервер після внесення змін у файл server.js;
для зручності у файл project.json можна прописати "scripts" {"start": "nodemon server.js"}
і запускати сервер із командної строки командою npm start
необхідно встановлювати
require('dotenv').config(); - для зони видиості змінних глобального оточення (.env), необхідно встановлювати
require('cors') - для кор заголовків, необхідно встановлювати const cors = require('cors'); app.use(cors());
require('body-parser') - додає підтримку JSON у тілі запиту, не потрібно встановлювати app.use(express.json());
require("fs") - для роботи з файлами, не потрібно встановлювати
ejs - Embedded JavaScript - для динамічного заповнення веб-сторінки контентом, що генерується скріптом
Динамічний контент розміщується у спеціальних тегах:
<% ... %> – виконання JavaScript-коду (без виводу в HTML);
<%- ... %> – HTML-розмітка буде інтерпретована браузером;
<%= ... %> – виведення значення в HTML (екранує небезпечні символи).
А сам файл необхідно зберегти з розширенням *.ejs і відкривати через сервер.
Необхідно встановити бібліотеку ejs, та не потрібно спеціально її запитувати в js-файлі
app.set("view engine", "ejs"); app.get('/', (req, res) => { res.render('index', req.query); });