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:
+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