getpgdata: главная отдаёт info напрямую (без EJS), версия 1.0.2
This commit is contained in:
@@ -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, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
||||
}
|
||||
|
||||
// Простая 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, '');
|
||||
|
||||
Reference in New Issue
Block a user