Files
yunrui_asset/backend/middleware/validation.js
T

96 lines
2.6 KiB
JavaScript
Raw Normal View History

const logger = require('../utils/logger').module('ValidationMiddleware');
const validate = (schema, source = 'body') => {
2026-03-06 13:57:37 +08:00
return async (req, res, next) => {
const data = source === 'query' ? req.query : req.body;
2026-03-06 13:57:37 +08:00
try {
let value;
2026-03-06 13:57:37 +08:00
if (schema.validate && typeof schema.validate === 'function') {
const result = schema.validate(data, {
abortEarly: false,
stripUnknown: true,
allowUnknown: source === 'query',
});
if (result && typeof result.then === 'function') {
value = await result;
} else if (result && result.error) {
const errorMessages = result.error.details.map(detail => ({
field: detail.path.join('.'),
message: detail.message,
}));
return res.status(400).json({
error: '参数验证失败',
details: errorMessages,
2026-03-06 13:57:37 +08:00
});
} else if (result && result.value !== undefined) {
value = result.value;
2026-03-06 13:57:37 +08:00
} else {
value = result;
2026-03-06 13:57:37 +08:00
}
} else if (schema.validateAsync) {
value = await schema.validateAsync(data, {
2026-03-06 13:57:37 +08:00
abortEarly: false,
stripUnknown: true,
allowUnknown: source === 'query',
2026-03-06 13:57:37 +08:00
});
} else {
const result = schema.validate(data, {
2026-03-06 13:57:37 +08:00
abortEarly: false,
stripUnknown: true,
allowUnknown: source === 'query',
2026-03-06 13:57:37 +08:00
});
if (result.error) {
const errorMessages = result.error.details.map(detail => ({
field: detail.path.join('.'),
message: detail.message,
}));
return res.status(400).json({
error: '参数验证失败',
details: errorMessages,
});
}
value = result.value;
2026-03-06 13:57:37 +08:00
}
if (source === 'query') {
req.query = value;
} else {
req.body = value;
}
next();
} catch (error) {
if (error.details) {
const errorMessages = error.details.map(detail => ({
field: detail.path.join('.'),
message: detail.message,
2026-03-06 13:57:37 +08:00
}));
return res.status(400).json({
error: '参数验证失败',
details: errorMessages,
2026-03-06 13:57:37 +08:00
});
}
logger.error('验证中间件错误', { error: error.message, stack: error.stack });
2026-03-06 13:57:37 +08:00
return res.status(500).json({
error: '验证过程发生错误',
message: error.message,
});
}
};
};
const validateQuery = schema => validate(schema, 'query');
const validateBody = schema => validate(schema, 'body');
module.exports = {
validate,
validateQuery,
validateBody,
};