如何筛选获取当前应用用户本人提交的最新表单记录?
问题原因
你之前的实现逻辑本质是直接取全局表单集合排序后的最后一条记录,新增的判断仅校验这单条全局最新记录是否属于当前用户,没有做用户维度的全量筛选,自然会出现「全局最新不是当前用户提交就无结果、不加判断就拿到别人数据」的问题。
解决方案
优先推荐:后端接口层直接返回目标数据
不要把全量表单数据返回给前端再做过滤,这种方式既会增加传输开销、拖慢加载速度,还存在其他用户表单数据泄露的越权风险。
后端查询数据库时直接增加两个规则即可:
- 增加筛选条件,仅匹配
owner为当前登录用户ID的表单记录 - 按表单提交时间倒序排序,取第一条结果返回
以Node.js操作MongoDB的常见写法为例:
// 后端查询逻辑 const latestUserForm = await Form.findOne( { owner: req.user._id }, // 仅筛选当前用户名下的表单 { sort: { submitTime: -1 } } // 按提交时间倒序,取最新的一条 )
临时兼容方案:前端对全量数据做筛选排序
如果暂时无法调整后端接口,可在前端拿到全量set数组后,先筛选出当前用户的所有表单,再排序取最新值,不要直接取全局数组的最后一位:
// 1. 筛选出当前用户提交的所有表单 const userForms = set.filter(item => item?.owner === user._id) let property = null // 2. 处理用户未提交过任何表单的空场景 if (!userForms.length) { // 此处写无提交记录的对应逻辑,比如展示引导提交的提示 property = null } else { // 3. 按表单提交时间倒序排序,不依赖全局数组的原有排序规则,避免排序逻辑变动导致结果错误 const sortedForms = userForms.sort((a, b) => new Date(b.submitTime) - new Date(a.submitTime)) // 4. 取排序后第一条即为当前用户最新提交的表单 property = sortedForms[0] }
注意事项
- 不要依赖全量表单数组的默认顺序取用户的最新记录,一旦全局排序规则调整、或其他用户在你之后提交了表单,原有取数组最后一位的逻辑就会拿到错误结果
- 空值判断要做全,避免用户从未提交过表单时出现数组取值报错
内容的提问来源于stack exchange,提问作者chris
相关产品推荐
相关产品推荐

