m***@163.com
m***@163.com
  • 发布:2025-06-24 22:37
  • 更新:2025-06-26 14:07
  • 阅读:100

【报Bug】uni-id-users表存在联表查询bug

分类:uni-app

产品分类: uniapp/H5

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: xxxxx

HBuilderX类型: 正式

HBuilderX版本号: 4.66

浏览器平台: Chrome

浏览器版本: xxxx

项目创建方式: HBuilderX

操作步骤:

userInfos.forEach(item => {
const real_name = item.realname_auth ? item.realname_auth.real_name : '' // <-- 潜在的出错点 1
if (real_name.startsWith('uni-im-encrypt:')) {
item.realname_auth.real_name = decrypt(real_name) // <-- 潜在的出错点 2
}
})

预期结果:

正常输出俩岸标查询寻结果

实际结果:

报错,提示realname_auth 未定义。我按照修改后的代码更新拓展JS文件,可以正常运行。

bug描述:

在联表查询时,如果涉及到uni-id-users表,则有时可能出现报错。
Error: Cannot read properties of undefined (reading 'realname_auth')
换其他表格或者部分数据就不会有问题。
经过反复排查,并且与gemini2.5Pro进行讨论后发现,问题可能出现在schema.ext.js中。
它有一个afterReadAction 函数,在其中访问了 realname_auth:
Generated javascript
userInfos.forEach(item => {
// ... 其他代码 ...
})

userInfos.forEach(item => {
const real_name = item.realname_auth ? item.realname_auth.real_name : '' // <-- 潜在的出错点 1
if (real_name.startsWith('uni-im-encrypt:')) {
item.realname_auth.real_name = decrypt(real_name) // <-- 潜在的出错点 2
}
})

核心问题在于 data.map(item => item[foreignKey][0]) 这一行代码。
它做了一个危险的假设:假设通过外键(foreignKey)关联查询到的 uni-id-users 记录一定存在。
实际场景中,这个假设不成立。
考虑以下情况:
数据不一致/脏数据:主表(比如 uni-im-friend)中的一条记录,它的 friend_uid 字段引用的用户 ID,在 uni-id-users 表里不存在(可能这个用户被删除了,但关联关系没有清理)。
JQL 查询结果:在这种情况下,JQL 的 lookup 操作会为这个 friend_uid 字段返回一个空数组 []。
当 item[foreignKey] 是一个空数组 [] 时,代码执行 item[foreignKey][0] 会尝试获取空数组的第一个元素,其结果就是 undefined。
.map 函数会将这个 undefined 值放入新的 userInfos 数组中。
最后,当 forEach 循环遍历到这个 undefined 元素时,执行 item.realname_auth 就变成了 undefined.realname_auth,从而导致程序崩溃。

修改后(推荐):
Generated javascript
if (foreignKey in data[0]) {
userInfos = data
// 关键步骤:先过滤掉那些 foreignKey 字段不存在或为空数组的项
.filter(item => item[foreignKey] && item[foreignKey].length > 0)
// 然后再安全地进行 map 操作
.map(item => item[foreignKey][0])
}

这个修复增加了 .filter() 步骤:
item[foreignKey]:确保关联字段存在。
item[foreignKey].length > 0:确保关联查询的结果不是空数组。
只有同时满足这两个条件的项才会被保留下来进行后续的 .map 操作,这样就从根本上杜绝了 userInfos 数组中出现 undefined 元素,也就解决了这个报错。

总结
问题现象:在对用户列表进行遍历时,尝试读取 undefined 的 realname_auth 属性。
问题根源:在处理联表查询时,代码没有处理关联查询失败(即外键指向一个不存在的记录)的情况,导致将 undefined 放入了待处理的用户列表中。
解决方案:在提取关联的用户信息前,使用 .filter() 方法过滤掉无效的关联数据,确保数据安全。

2025-06-24 22:37 负责人:DCloud_uniCloud_CRL 分享
已邀请:
DCloud_uniCloud_CRL

DCloud_uniCloud_CRL

这是插件内的代码还是你自己业务代码呢?

  • m***@163.com (作者)

    毫无疑问,是官方的代码呀

    2025-06-27 21:53

  • DCloud_uniCloud_CRL

    回复 m***@163.com: 这是哪个插件的代码呢?

    2025-07-01 14:23

要回复问题请先登录注册