后端版本服务器部署成功
This commit is contained in:
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user