在保存标注结果时出现错误:
Objects are not valid as a React child (found: object with keys {type, loc, msg, input, url})
FastAPI 的验证错误返回的是一个对象数组,每个对象包含:
type: 错误类型loc: 错误位置(字段路径)msg: 错误消息input: 输入值url: 文档链接当这个对象直接传递给 Toast 组件时,React 无法渲染对象,导致错误。
在 web/apps/lq_label/src/services/api.ts 中:
apiClient.interceptors.response.use(
(response) => response,
(error: AxiosError) => {
let errorMessage = '发生了意外错误';
if (error.response?.data) {
const data = error.response.data as any;
// Handle FastAPI validation errors (array of error objects)
if (Array.isArray(data.detail)) {
// Format validation errors into readable message
errorMessage = data.detail
.map((err: any) => {
const field = err.loc?.join('.') || '字段';
return `${field}: ${err.msg}`;
})
.join('; ');
}
// Handle simple string error message
else if (typeof data.detail === 'string') {
errorMessage = data.detail;
}
// Handle object error message
else if (typeof data.detail === 'object' && data.detail !== null) {
errorMessage = JSON.stringify(data.detail);
}
// Fallback to error message
else if (data.message) {
errorMessage = data.message;
}
} else if (error.message) {
errorMessage = error.message;
}
toast.error(errorMessage);
// ...
}
);
改进点:
字段: 错误消息)在 web/apps/lq_label/src/services/toast.ts 中:
error(message: string | any, title?: string, duration = 5000): void {
// 确保 message 是字符串
let messageStr: string;
if (typeof message === 'string') {
messageStr = message;
} else if (message && typeof message === 'object') {
// 如果是对象,尝试提取有用信息
if (message.message) {
messageStr = message.message;
} else if (message.msg) {
messageStr = message.msg;
} else {
messageStr = JSON.stringify(message);
}
} else {
messageStr = String(message);
}
this.notify({
type: ToastType.error,
title: title || '错误',
message: messageStr,
duration,
});
}
改进点:
message 或 msg 字段JSON.stringify() 或 String(){
"detail": [
{
"type": "string_type",
"loc": ["body", "name"],
"msg": "Input should be a valid string",
"input": null,
"url": "https://errors.pydantic.dev/..."
},
{
"type": "missing",
"loc": ["body", "data"],
"msg": "Field required",
"input": {"name": "test"},
"url": "https://errors.pydantic.dev/..."
}
]
}
body.name: Input should be a valid string; body.data: Field required
修复后,以下场景都能正确显示错误消息:
web/apps/lq_label/src/services/api.ts - API 拦截器web/apps/lq_label/src/services/toast.ts - Toast 服务通过增强错误处理逻辑,现在系统能够: