fix(设备管理): 改进设备导入的错误处理和验证逻辑
- 前端优化错误消息展示,区分500错误和其他错误情况 - 后端增加设备类型验证、设备ID唯一性检查和机柜ID非空验证 - 改进Sequelize错误处理,提供更友好的错误消息 - 统一前后端错误响应格式
This commit is contained in:
@@ -424,6 +424,20 @@ router.post('/import', async (req, res) => {
|
||||
throw new Error(`缺少必填字段:${missingFields.join('、')}`);
|
||||
}
|
||||
|
||||
// 验证设备类型值
|
||||
const validTypes = ['server', 'switch', 'router', 'storage', 'other'];
|
||||
if (!validTypes.includes(fieldValueMap['设备类型'])) {
|
||||
throw new Error(`设备类型无效,有效值为:${validTypes.join('、')},当前值:${fieldValueMap['设备类型']}`);
|
||||
}
|
||||
|
||||
// 验证设备ID是否已存在
|
||||
const existingDeviceById = await Device.findOne({
|
||||
where: { deviceId: fieldValueMap['设备ID'] }
|
||||
});
|
||||
if (existingDeviceById) {
|
||||
throw new Error(`设备ID已存在:${fieldValueMap['设备ID']}`);
|
||||
}
|
||||
|
||||
// 验证序列号是否已存在
|
||||
const existingDevice = await Device.findOne({
|
||||
where: { serialNumber: fieldValueMap['序列号'] }
|
||||
@@ -432,6 +446,11 @@ router.post('/import', async (req, res) => {
|
||||
throw new Error(`序列号已存在:${fieldValueMap['序列号']}`);
|
||||
}
|
||||
|
||||
// 验证机柜ID是否为空
|
||||
if (!fieldValueMap['所在机柜ID'] || fieldValueMap['所在机柜ID'].trim() === '') {
|
||||
throw new Error('所在机柜ID不能为空');
|
||||
}
|
||||
|
||||
// 验证机柜是否存在,如果不存在则自动创建
|
||||
if (!rackIds.includes(fieldValueMap['所在机柜ID'])) {
|
||||
// 自动创建机柜
|
||||
@@ -546,17 +565,36 @@ router.post('/import', async (req, res) => {
|
||||
stats.success++;
|
||||
} catch (error) {
|
||||
stats.failed++;
|
||||
stats.errors.push({ row: rowNum, error: error.message, data: row });
|
||||
let errorMessage = error.message;
|
||||
|
||||
if (error.name === 'SequelizeUniqueConstraintError') {
|
||||
const errors = error.errors || [];
|
||||
for (const err of errors) {
|
||||
if (err.path === 'deviceId') {
|
||||
errorMessage = `设备ID已存在`;
|
||||
break;
|
||||
} else if (err.path === 'serialNumber') {
|
||||
errorMessage = `序列号已存在`;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (error.name === 'SequelizeValidationError') {
|
||||
errorMessage = '数据验证失败,请检查字段格式';
|
||||
}
|
||||
|
||||
stats.errors.push({ row: rowNum, error: errorMessage, data: row });
|
||||
}
|
||||
}
|
||||
|
||||
// 删除临时文件
|
||||
fs.unlinkSync(filePath);
|
||||
|
||||
res.json({ statistics: stats });
|
||||
} catch (error) {
|
||||
console.error('导入设备数据失败:', error);
|
||||
res.status(500).json({ error: '导入设备数据失败' });
|
||||
const errorMessage = error.message || '导入过程中发生未知错误';
|
||||
res.status(500).json({
|
||||
errors: [{ row: 0, error: errorMessage }]
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user