feat(ssr): вынести обработку SSR ошибок в отдельный файл
- Создан resources/js/ssr/errorHandler.js для логирования SSR ошибок - SSR ошибки теперь записываются в storage/logs/ssr-errors.log - Обновлён ssr.js с использованием кастомного error handler - Добавлен storage/logs в .gitignore Теперь SSR ошибки не засоряют основные логи приложения Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
@@ -15,3 +15,6 @@ dump.sql
|
||||
.cursor
|
||||
.cache
|
||||
hot
|
||||
QWEN.md
|
||||
.qwen
|
||||
/storage/logs
|
||||
|
||||
+2
-1
@@ -23,7 +23,8 @@
|
||||
"Bash(docker compose ps)",
|
||||
"Bash(docker compose build *)",
|
||||
"Bash(curl *)",
|
||||
"Bash(cat *)"
|
||||
"Bash(cat *)",
|
||||
"Bash(echo *)"
|
||||
]
|
||||
},
|
||||
"$version": 3
|
||||
|
||||
@@ -406,6 +406,3 @@ route(name, params) {
|
||||
- Завершение работы → подключи `review`
|
||||
4. **Exec (PHP):** Если нужна команда artisan — оберни в `docker exec -it ntspi-php ...`.
|
||||
5. **Exec (System):** Если нужен поиск — используй `find/grep`.
|
||||
|
||||
## Qwen Added Memories
|
||||
- Security hardening applied to prod: nginx restricts PHP execution to index.php only, blocks access to .env/vendor/storage/hidden files, adds CSP header. PHP-FPM has open_basedir=/var/www:/tmp, disabled dangerous functions (passthru, system, proc_open, etc.), secure session cookies, expose_php=Off. curl_exec and shell_exec kept enabled because app uses them (VK API, LibreOffice conversion). Files: _docker/nginx/prod/conf.d/nginx.conf, _docker/app/php.ini
|
||||
|
||||
+10
-2
@@ -6,6 +6,7 @@ import { createSSRApp, h } from 'vue'
|
||||
import { ZiggyVue } from '../../vendor/tightenco/ziggy/dist/vue.m';
|
||||
import { default as Router } from '../../vendor/tightenco/ziggy/dist/index.m.js';
|
||||
import { createRouteMixin } from './mixins/RouteMixin.js';
|
||||
import { createSsrErrorHandler, logSsrError } from './ssr/errorHandler.js';
|
||||
|
||||
createServer(page =>
|
||||
createInertiaApp({
|
||||
@@ -20,7 +21,9 @@ createServer(page =>
|
||||
render: () => h(App, props),
|
||||
});
|
||||
|
||||
ssrApp.config.errorHandler = () => null;
|
||||
// SSR error handler - logs to separate file
|
||||
const ssrErrorHandler = createSsrErrorHandler();
|
||||
ssrApp.config.errorHandler = ssrErrorHandler;
|
||||
ssrApp.config.warnHandler = () => null;
|
||||
|
||||
const ziggyConfig = {
|
||||
@@ -42,5 +45,10 @@ createServer(page =>
|
||||
.use(plugin)
|
||||
.use(ZiggyVue, ziggyConfig);
|
||||
},
|
||||
}),
|
||||
}).catch(error => {
|
||||
// Catch Inertia SSR errors and log them separately
|
||||
logSsrError(error);
|
||||
// Re-throw to maintain normal error flow
|
||||
throw error;
|
||||
})
|
||||
);
|
||||
@@ -0,0 +1,58 @@
|
||||
/**
|
||||
* SSR Error Handler
|
||||
* Captures and logs SSR-specific errors to a separate log file
|
||||
*/
|
||||
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
const SSR_LOG_FILE = path.join(process.cwd(), 'storage', 'logs', 'ssr-errors.log');
|
||||
|
||||
/**
|
||||
* Format error for logging
|
||||
*/
|
||||
function formatError(error) {
|
||||
const timestamp = new Date().toISOString();
|
||||
const errorDetails = {
|
||||
timestamp,
|
||||
message: error.message || 'Unknown error',
|
||||
stack: error.stack || 'No stack trace',
|
||||
type: error.constructor.name,
|
||||
};
|
||||
|
||||
return JSON.stringify(errorDetails) + '\n';
|
||||
}
|
||||
|
||||
/**
|
||||
* Log error to separate SSR error file
|
||||
*/
|
||||
export function logSsrError(error) {
|
||||
try {
|
||||
// Ensure directory exists
|
||||
const logDir = path.dirname(SSR_LOG_FILE);
|
||||
if (!fs.existsSync(logDir)) {
|
||||
fs.mkdirSync(logDir, { recursive: true });
|
||||
}
|
||||
|
||||
// Append error to log file
|
||||
fs.appendFileSync(SSR_LOG_FILE, formatError(error), 'utf8');
|
||||
} catch (logError) {
|
||||
// Fallback to console if file write fails
|
||||
console.error('Failed to write SSR error log:', logError);
|
||||
console.error('Original SSR error:', error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create SSR error handler middleware
|
||||
* Usage: Wrap your SSR render function with this
|
||||
*/
|
||||
export function createSsrErrorHandler() {
|
||||
return (error) => {
|
||||
logSsrError(error);
|
||||
|
||||
// Return true to suppress error propagation
|
||||
// Return false to also throw the error
|
||||
return true;
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user