初始化

This commit is contained in:
2025-08-21 10:43:04 +08:00
commit 29a79b1c6b
68 changed files with 13314 additions and 0 deletions
+50
View File
@@ -0,0 +1,50 @@
/**
* 认证中间件
*/
const authMiddleware = (req, res, next) => {
try {
// 检查后端是否已登录
if (!req.backend || !req.backend.isLoggedIn) {
return res.status(401).json({
error: true,
message: 'Authentication required',
code: 'AUTH_REQUIRED'
});
}
// 检查访问令牌是否有效
const auth = req.backend.getAuth();
if (!auth || !auth.accessToken) {
return res.status(401).json({
error: true,
message: 'Invalid access token',
code: 'INVALID_TOKEN'
});
}
next();
} catch (error) {
next(error);
}
};
/**
* 可选的认证中间件(不强制要求登录)
*/
const optionalAuthMiddleware = (req, res, next) => {
try {
// 如果后端已登录,将用户信息添加到请求对象
if (req.backend && req.backend.isLoggedIn) {
req.user = req.backend.config.user;
}
next();
} catch (error) {
next(error);
}
};
module.exports = {
authMiddleware,
optionalAuthMiddleware
};
+62
View File
@@ -0,0 +1,62 @@
/**
* 全局错误处理中间件
*/
const errorHandler = (err, req, res, next) => {
console.error('错误详情:', err);
// 默认错误信息
let statusCode = 500;
let message = 'Internal Server Error';
let details = null;
// 根据错误类型设置状态码和消息
if (err.name === 'ValidationError') {
statusCode = 400;
message = 'Validation Error';
details = err.message;
} else if (err.name === 'UnauthorizedError') {
statusCode = 401;
message = 'Unauthorized';
} else if (err.name === 'ForbiddenError') {
statusCode = 403;
message = 'Forbidden';
} else if (err.name === 'NotFoundError') {
statusCode = 404;
message = 'Not Found';
} else if (err.code === 'ENOTFOUND') {
statusCode = 503;
message = 'Service Unavailable';
details = 'Network connection failed';
} else if (err.code === 'ECONNREFUSED') {
statusCode = 503;
message = 'Service Unavailable';
details = 'Connection refused';
} else if (err.response) {
// Axios 错误
statusCode = err.response.status || 500;
message = err.response.statusText || 'Request Failed';
details = err.response.data;
} else if (err.message) {
message = err.message;
}
// 构建错误响应
const errorResponse = {
error: true,
message,
statusCode,
timestamp: new Date().toISOString(),
path: req.originalUrl,
method: req.method
};
// 在开发环境下添加详细信息
if (process.env.NODE_ENV === 'development') {
errorResponse.details = details;
errorResponse.stack = err.stack;
}
res.status(statusCode).json(errorResponse);
};
module.exports = { errorHandler };