1. 新增动态设备校验Schema生成器,支持从数据库读取字段配置生成校验规则 2. 重构设备增改接口,使用动态校验替代硬编码Schema 3. 调整前端设备表单,适配字段配置并锁定核心系统字段 4. 修复前后端默认字段配置不一致问题 5. 新增字段管理页面防护,锁定核心字段的必填/可见配置
102 lines
2.8 KiB
JavaScript
102 lines
2.8 KiB
JavaScript
const logger = require('../utils/logger').module('ValidationMiddleware');
|
|
|
|
const validate = (schemaOrFn, source = 'body') => {
|
|
return async (req, res, next) => {
|
|
const data = source === 'query' ? req.query : req.body;
|
|
|
|
try {
|
|
// 支持函数形式的schema(动态schema:异步函数或同步函数返回Joi schema)
|
|
let schema = schemaOrFn;
|
|
if (typeof schemaOrFn === 'function') {
|
|
schema = await schemaOrFn();
|
|
}
|
|
|
|
let value;
|
|
|
|
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,
|
|
});
|
|
} else if (result && result.value !== undefined) {
|
|
value = result.value;
|
|
} else {
|
|
value = result;
|
|
}
|
|
} else if (schema.validateAsync) {
|
|
value = await schema.validateAsync(data, {
|
|
abortEarly: false,
|
|
stripUnknown: true,
|
|
allowUnknown: source === 'query',
|
|
});
|
|
} else {
|
|
const result = schema.validate(data, {
|
|
abortEarly: false,
|
|
stripUnknown: true,
|
|
allowUnknown: source === 'query',
|
|
});
|
|
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;
|
|
}
|
|
|
|
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,
|
|
}));
|
|
|
|
return res.status(400).json({
|
|
error: '参数验证失败',
|
|
details: errorMessages,
|
|
});
|
|
}
|
|
|
|
logger.error('验证中间件错误', { error: error.message, stack: error.stack });
|
|
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,
|
|
};
|