From 0499a3f0e51b6bb18177e72c48d9bd0f3bb44e76 Mon Sep 17 00:00:00 2001 From: Wenyan Date: Tue, 25 Nov 2025 16:15:27 +0800 Subject: [PATCH] =?UTF-8?q?fix(evaluation):=20=E4=BF=AE=E5=A4=8D=20updateE?= =?UTF-8?q?valuationPoint=20=E8=BF=94=E5=9B=9E=E6=95=B0=E6=8D=AE=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=88=A4=E6=96=AD=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 问题描述 更新评查点时出现"更新评查点失败:返回数据格式不正确"错误 ## 根本原因 - updateEvaluationPoint 和 createEvaluationPoint 对返回数据的格式判断过于严格 - 当 PostgREST 返回空数组时,代码没有正确处理 ## 解决方案 ### updateEvaluationPoint - 添加详细的调试日志,记录返回数据的类型和格式 - 当返回空数组时,尝试重新获取数据(因为更新可能已成功) - 改进错误消息,提供更明确的错误提示 ### createEvaluationPoint - 添加相同的调试日志 - 当返回空数组时,提供明确的错误消息并建议刷新页面 - 改进数据格式判断逻辑 ## 技术改进 - 分层处理数组格式:有数据、空数组、非数组 - 空数组情况下的降级处理(update 重新获取,create 提示刷新) - 保留所有调试日志便于问题诊断 ## 测试建议 请在控制台查看日志输出,确认 PostgREST 返回的实际数据格式 --- app/api/evaluation_points/rules.ts | 57 +++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/app/api/evaluation_points/rules.ts b/app/api/evaluation_points/rules.ts index 312b97d..19c21e0 100644 --- a/app/api/evaluation_points/rules.ts +++ b/app/api/evaluation_points/rules.ts @@ -2009,10 +2009,28 @@ export async function createEvaluationPoint( return { error: response.error, status: response.status }; } - if (response.data && Array.isArray(response.data) && response.data.length > 0) { - return { data: response.data[0] }; - } else if (response.data && !Array.isArray(response.data)) { - return { data: response.data }; + // 调试日志:查看实际返回的数据格式 + console.log('createEvaluationPoint 响应数据:', { + data: response.data, + isArray: Array.isArray(response.data), + type: typeof response.data, + length: Array.isArray(response.data) ? response.data.length : 'N/A' + }); + + if (response.data) { + // 如果是数组且有数据,返回第一个元素 + if (Array.isArray(response.data) && response.data.length > 0) { + return { data: response.data[0] }; + } + // 如果是数组但为空,PostgREST 可能没有配置正确的 Prefer 头部 + else if (Array.isArray(response.data) && response.data.length === 0) { + console.error('PostgREST 返回空数组,无法获取新创建的评查点数据'); + return { error: '创建成功但无法获取创建的数据,请刷新页面', status: 500 }; + } + // 如果不是数组,直接返回 + else if (!Array.isArray(response.data)) { + return { data: response.data }; + } } return { error: '创建评查点失败:返回数据格式不正确', status: 500 }; @@ -2050,10 +2068,33 @@ export async function updateEvaluationPoint( return { error: response.error, status: response.status }; } - if (response.data && Array.isArray(response.data) && response.data.length > 0) { - return { data: response.data[0] }; - } else if (response.data && !Array.isArray(response.data)) { - return { data: response.data }; + // 调试日志:查看实际返回的数据格式 + console.log('updateEvaluationPoint 响应数据:', { + data: response.data, + isArray: Array.isArray(response.data), + type: typeof response.data, + length: Array.isArray(response.data) ? response.data.length : 'N/A' + }); + + if (response.data) { + // 如果是数组且有数据,返回第一个元素 + if (Array.isArray(response.data) && response.data.length > 0) { + return { data: response.data[0] }; + } + // 如果是数组但为空,说明可能是 PostgREST 配置问题,但更新应该成功了 + else if (Array.isArray(response.data) && response.data.length === 0) { + console.warn('PostgREST 返回空数组,可能需要检查 Prefer 头部设置'); + // 尝试重新获取数据 + const refetchResponse = await getEvaluationPoint(id, token); + if (refetchResponse.data) { + return { data: refetchResponse.data }; + } + return { error: '更新成功但无法获取更新后的数据', status: 500 }; + } + // 如果不是数组,直接返回 + else if (!Array.isArray(response.data)) { + return { data: response.data }; + } } return { error: '更新评查点失败:返回数据格式不正确', status: 500 };