后端版本服务器部署成功

This commit is contained in:
2025-09-11 13:11:04 +08:00
parent a1cd342c99
commit 9b7a0482e1
24 changed files with 1039 additions and 1157 deletions

View File

@@ -23,6 +23,39 @@ const notFound = (req, res, next) => {
next(error)
}
// MySQL重复键错误处理
const handleDuplicateFieldsDB = (err) => {
// 提取重复的字段值
let value = '未知字段'
if (err.sqlMessage && err.sqlMessage.includes('Duplicate entry')) {
const match = err.sqlMessage.match(/Duplicate entry '([^']+)' for key '([^']+)'/)
if (match && match[1]) {
value = match[1]
}
}
const message = `字段值 ${value} 已存在,请使用其他值`
return new AppError(message, 400)
}
// MySQL验证错误处理
const handleValidationErrorDB = (err) => {
// MySQL验证错误通常在sqlMessage中包含详细信息
const message = err.sqlMessage || '输入数据无效'
return new AppError(message, 400)
}
// JWT错误处理
const handleJWTError = () =>
new AppError('无效的token请重新登录', 401)
const handleJWTExpiredError = () =>
new AppError('token已过期请重新登录', 401)
// MySQL连接错误处理
const handleDBConnectionError = (err) => {
return new AppError('数据库连接失败,请稍后再试', 503)
}
// 全局错误处理中间件
const globalErrorHandler = (err, req, res, next) => {
err.statusCode = err.statusCode || 500
@@ -38,35 +71,28 @@ const globalErrorHandler = (err, req, res, next) => {
stack: err.stack
})
} else {
// 生产环境:区分不同类型的错误并提供适当的响应
let error = { ...err, message: err.message } // 创建错误副本
// 数据库错误处理
if (error.code === 'ER_DUP_ENTRY') error = handleDuplicateFieldsDB(error)
if (error.code === 'ER_NO_REFERENCED_ROW_2' || error.code === 'ER_BAD_NULL_ERROR') {
error = handleValidationErrorDB(error)
}
if (error.code === 'ECONNREFUSED') error = handleDBConnectionError(error)
// JWT错误处理
if (error.name === 'JsonWebTokenError') error = handleJWTError()
if (error.name === 'TokenExpiredError') error = handleJWTExpiredError()
// 生产环境简化错误信息
res.status(err.statusCode).json({
status: err.status,
message: err.message
res.status(error.statusCode || 500).json({
status: error.status || 'error',
message: error.message || '服务器内部错误'
})
}
}
// MongoDB重复键错误处理
const handleDuplicateFieldsDB = (err) => {
const value = err.errmsg.match(/(["'])(\\?.)*?\1/)[0]
const message = `字段值 ${value} 已存在,请使用其他值`
return new AppError(message, 400)
}
// MongoDB验证错误处理
const handleValidationErrorDB = (err) => {
const errors = Object.values(err.errors).map(el => el.message)
const message = `输入数据无效: ${errors.join('. ')}`
return new AppError(message, 400)
}
// JWT错误处理
const handleJWTError = () =>
new AppError('无效的token请重新登录', 401)
const handleJWTExpiredError = () =>
new AppError('token已过期请重新登录', 401)
module.exports = {
AppError,
catchAsync,
@@ -75,5 +101,6 @@ module.exports = {
handleDuplicateFieldsDB,
handleValidationErrorDB,
handleJWTError,
handleJWTExpiredError
handleJWTExpiredError,
handleDBConnectionError
}