getpgdata: главная отдаёт info напрямую (без EJS), версия 1.0.2

This commit is contained in:
naeel
2026-08-18 20:32:29 +04:00
parent c8a776ec04
commit 352e7ec2e6
3 changed files with 88 additions and 13 deletions
+61 -12
View File
@@ -62,31 +62,80 @@ app.get('/healthz', async (req, res) => {
}
});
// Главная: состояние подключения + список таблиц
// Главная: минимальный вывод информации на экран.
// Не зависит от EJS-шаблонов — всегда отдаёт HTML, даже если БД недоступна.
app.get('/', async (req, res) => {
let tables = null;
let error = null;
const cfg = dbConfig();
let dbStatus = 'нет данных';
let tablesHtml = '';
try {
const r = await pool.query(
const r = await pool.query('SELECT version() AS v');
dbStatus = 'подключено: ' + (r.rows[0] && r.rows[0].v ? r.rows[0].v : 'ok');
} catch (e) {
dbStatus = 'недоступна: ' + (e && e.message ? e.message : String(e));
}
try {
const t = await pool.query(
`SELECT schemaname, tablename
FROM pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY schemaname, tablename`
);
tables = r.rows;
if (t.rows && t.rows.length) {
tablesHtml = t.rows
.map((r) => `<tr><td>${esc(r.schemaname)}</td><td>${esc(r.tablename)}</td></tr>`)
.join('');
} else {
tablesHtml = '<tr><td colspan="2">таблиц нет</td></tr>';
}
} catch (e) {
error = e.message;
tablesHtml = '<tr><td colspan="2">не удалось получить таблицы</td></tr>';
}
res.render('index', {
cfg: dbConfig(),
tables,
error,
env: APP_ENV,
});
res
.status(200)
.set('Content-Type', 'text/html; charset=utf-8')
.send(html(cfg, dbStatus, tablesHtml));
});
// Экранирование HTML
function esc(v) {
return String(v).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
}
// Простая HTML-страница с информацией
function html(cfg, dbStatus, tablesHtml) {
return `<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>getpgdata — информация</title>
</head>
<body style="font-family: sans-serif; margin: 24px;">
<h1>getpgdata</h1>
<p>Node.js ${esc(process.version)} · env=${esc(APP_ENV)} · PID=${esc(String(process.pid))}</p>
<h2>База данных</h2>
<table border="1" cellspacing="0" cellpadding="6">
<tr><th>Host</th><td>${esc(cfg.host)}</td></tr>
<tr><th>Port</th><td>${esc(String(cfg.port))}</td></tr>
<tr><th>Database</th><td>${esc(cfg.database)}</td></tr>
<tr><th>User</th><td>${esc(cfg.user)}</td></tr>
<tr><th>Статус</th><td>${esc(dbStatus)}</td></tr>
</table>
<h2>Таблицы</h2>
<table border="1" cellspacing="0" cellpadding="6">
<tr><th>Схема</th><th>Таблица</th></tr>
${tablesHtml}
</table>
</body>
</html>`;
}
// Просмотр таблицы с пагинацией
app.get('/table', async (req, res) => {
const schema = (req.query.schema || 'public').replace(/[^a-zA-Z0-9_]/g, '');