diff --git a/backend/src/routes/lab.js b/backend/src/routes/lab.js index 1cadd5b..55070c6 100644 --- a/backend/src/routes/lab.js +++ b/backend/src/routes/lab.js @@ -44,7 +44,16 @@ function rowToSim(r) { /* ── GET /api/lab/sims ─────────────────────────────────────────────────── */ router.get('/sims', (_req, res) => { - const rows = db.prepare(`SELECT * FROM lab_sims ORDER BY sort_order, id`).all(); + let rows; + try { + rows = db.prepare(`SELECT * FROM lab_sims ORDER BY sort_order, id`).all(); + } catch (e) { + // Деградация вместо 500: если миграция lab_sims ещё не применена на этом + // инстансе (старый процесс/другая БД) — отдаём пустой каталог, чтобы админка + // не падала. Нужно применить миграцию и перезапустить сервер. + console.warn('[lab] lab_sims недоступна (нужна миграция/перезапуск):', e.message); + return res.json({ module_disabled: readModuleDisabled(), sims: [], needs_migration: true }); + } const legacyDisabled = readLegacyDisabledIds(); const sims = rows.map(r => { const s = rowToSim(r); diff --git a/frontend/js/labs/lab-init.js b/frontend/js/labs/lab-init.js index d9eda90..3e9d5d1 100644 --- a/frontend/js/labs/lab-init.js +++ b/frontend/js/labs/lab-init.js @@ -30,6 +30,19 @@ var geomSim = null; var qualSim = null; + /* Контент-движок, Фаза 3 (ленивая загрузка): часть глобалов с экземплярами + симуляций объявляется внутри их собственных НЫНЕ ЛЕНИВЫХ файлов, поэтому до + первого открытия такой симуляции они не существуют. Legacy-«дробовик» + _pauseAllSims()/closeSim() ссылается на них по голому имени, что до загрузки + любого файла бросало ReferenceError (напр. cirSim). Предсоздаём эти имена как + свойства window (null), чтобы guard'ы безопасно давали false; при загрузке + файла симуляции его собственный var/присваивание обновит тот же глобал. */ + ['cirSim','reacSim','flaskSim','newtonSim','sandboxSim','crystalSim','orbitalsSim', + 'stereoSim','angryBirdsSim','trigSim','pendSim','radioactiveSim','heSim', + 'periodicSim','organicSim','_solutionsSim','mirrorSim'].forEach(function (_n) { + if (!(_n in window)) window[_n] = null; + }); + var ALL_SIM_BODIES = ['sim-graph','sim-proj','sim-coll','sim-tri','sim-trigcircle','sim-emfield', 'sim-molphys', 'sim-circuit','sim-chemistry','sim-dynamics',