'use strict'; /* clientErrorController — приём ошибок из браузера пользователя. Пишем в общий error_log с level='client', чтобы они появились в админ-вкладке «Ошибки». Запись не должна ронять запрос — любые сбои глушим. */ const db = require('../db/db'); const MAX_MSG = 1000, MAX_STACK = 4000, MAX_ROUTE = 400; const clamp = (v, n) => (v == null ? null : String(v).slice(0, n)); function report(req, res) { const b = req.body || {}; const message = (clamp(b.message, MAX_MSG) || '').trim(); if (!message) return res.status(400).json({ error: 'message required' }); const kind = b.kind === 'unhandledrejection' ? 'rejection' : 'error'; const route = clamp(b.url || b.route, MAX_ROUTE); let stack = clamp(b.stack, MAX_STACK); // если стека нет — собираем источник:строка:колонка if (!stack && (b.source || b.line)) stack = `${b.source || ''}:${b.line || ''}:${b.col || ''}`; try { db.prepare( 'INSERT INTO error_log (level, message, stack, route, method, user_id) VALUES (?, ?, ?, ?, ?, ?)' ).run('client', message, stack, route, kind, req.user.id); } catch { /* лог не должен ломать ответ */ } res.json({ ok: true }); } module.exports = { report };