From 6fa87784a9a95dee8a0990889e1960eaec569dcd Mon Sep 17 00:00:00 2001 From: Backend Developer Date: Tue, 10 Mar 2026 08:16:53 +0000 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E7=AB=AF:=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86=E4=B8=AD?= =?UTF-8?q?=E9=97=B4=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/index.js | 4 ++ backend/src/middleware/errorHandler.js | 57 ++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 backend/src/middleware/errorHandler.js diff --git a/backend/src/index.js b/backend/src/index.js index f1f0bc7..5220d8c 100644 --- a/backend/src/index.js +++ b/backend/src/index.js @@ -4,6 +4,7 @@ const authRoutes = require('./routes/auth'); const fileRoutes = require('./routes/files'); const shareRoutes = require('./routes/share'); const syncRoutes = require('./routes/sync'); +const errorHandler = require('./middleware/errorHandler'); const app = express(); const PORT = process.env.PORT || 3000; @@ -17,6 +18,9 @@ app.use('/api/files', fileRoutes); app.use('/api/share', shareRoutes); app.use('/api/sync', syncRoutes); +// Error handler +app.use(errorHandler); + // Health check app.get('/api/health', (req, res) => { res.json({ status: 'ok' }); diff --git a/backend/src/middleware/errorHandler.js b/backend/src/middleware/errorHandler.js new file mode 100644 index 0000000..f3df715 --- /dev/null +++ b/backend/src/middleware/errorHandler.js @@ -0,0 +1,57 @@ +// 统一错误处理中间件 +const errorHandler = (err, req, res, next) => { + console.error('Error:', err); + + // JWT 错误 + if (err.name === 'JsonWebTokenError') { + return res.status(401).json({ + success: false, + error: 'Invalid token', + code: 'INVALID_TOKEN' + }); + } + + if (err.name === 'TokenExpiredError') { + return res.status(401).json({ + success: false, + error: 'Token expired', + code: 'TOKEN_EXPIRED' + }); + } + + // Multer 文件上传错误 + if (err.code === 'LIMIT_FILE_SIZE') { + return res.status(400).json({ + success: false, + error: 'File too large', + code: 'FILE_TOO_LARGE' + }); + } + + if (err.code === 'LIMIT_FILE_COUNT') { + return res.status(400).json({ + success: false, + error: 'Too many files', + code: 'TOO_MANY_FILES' + }); + } + + // 数据库错误 + if (err.code === 'SQLITE_CONSTRAINT') { + return res.status(400).json({ + success: false, + error: 'Data constraint violation', + code: 'CONSTRAINT_VIOLATION' + }); + } + + // 默认错误 + const statusCode = err.statusCode || 500; + res.status(statusCode).json({ + success: false, + error: err.message || 'Internal server error', + code: err.code || 'INTERNAL_ERROR' + }); +}; + +module.exports = errorHandler;