Files

109 lines
3.0 KiB
JavaScript

/**
* server.js — Node.js CRUD (Express + PostgreSQL).
*
* Переменные окружения:
* PGHOST, PGPORT, PGDATABASE, PGUSER, PGPASSWORD
* TABLE_NAME (по умолчанию crud_items)
* PORT (по умолчанию 3000)
*
* При старте: CREATE TABLE IF NOT EXISTS.
*/
const express = require("express");
const { Pool } = require("pg");
const path = require("path");
const VERSION = "1.0.0";
const TABLE_NAME = process.env.TABLE_NAME || "crud_items";
const PORT = process.env.PORT || 3000;
const pool = new Pool({
host: process.env.PGHOST || "127.0.0.1",
port: parseInt(process.env.PGPORT || "5432"),
database: process.env.PGDATABASE || "postgres",
user: process.env.PGUSER || "postgres",
password: process.env.PGPASSWORD || "",
ssl: process.env.PGSSLMODE === "require" ? { rejectUnauthorized: false } : false,
});
const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(express.static(path.join(__dirname, "public")));
app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "views"));
// --- Инициализация БД ---
async function initDB() {
const client = await pool.connect();
try {
await client.query(`
CREATE TABLE IF NOT EXISTS ${TABLE_NAME} (
id SERIAL PRIMARY KEY,
value TEXT NOT NULL DEFAULT ''
)
`);
} finally {
client.release();
}
}
// --- Главная страница (GET + POST) ---
app.get("/", async (req, res) => {
try {
let editRow = null;
if (req.query.edit) {
const result = await pool.query(
`SELECT id, value FROM ${TABLE_NAME} WHERE id = $1`,
[parseInt(req.query.edit)]
);
if (result.rows.length > 0) editRow = result.rows[0];
}
const result = await pool.query(
`SELECT id, value FROM ${TABLE_NAME} ORDER BY id`
);
res.render("index", {
table_name: TABLE_NAME,
rows: result.rows,
editRow,
version: VERSION,
});
} catch (err) {
res.status(500).send(err.message);
}
});
app.post("/", async (req, res) => {
try {
const { action, value, id } = req.body;
if (action === "create") {
await pool.query(`INSERT INTO ${TABLE_NAME} (value) VALUES ($1)`, [value || ""]);
} else if (action === "update") {
await pool.query(`UPDATE ${TABLE_NAME} SET value = $1 WHERE id = $2`, [
value || "",
parseInt(id || 0),
]);
} else if (action === "delete") {
await pool.query(`DELETE FROM ${TABLE_NAME} WHERE id = $1`, [
parseInt(id || 0),
]);
}
res.redirect("/");
} catch (err) {
res.status(500).send(err.message);
}
});
// --- Старт ---
// Сервер стартует всегда, даже если PG недоступен.
// initDB — асинхронно, ошибка логируется но не роняет под.
initDB()
.then(() => console.log("DB ready"))
.catch((err) => console.error("DB init failed:", err.message));
app.listen(PORT, () => {
console.log(`Node.js CRUD v${VERSION} — http://0.0.0.0:${PORT}`);
});