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
}
})

- 发布:2025-06-24 22:37
- 更新:2025-06-26 14:07
- 阅读:100
产品分类: uniapp/H5
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: xxxxx
HBuilderX类型: 正式
HBuilderX版本号: 4.66
浏览器平台: Chrome
浏览器版本: xxxx
项目创建方式: HBuilderX
操作步骤:
预期结果:
正常输出俩岸标查询寻结果
正常输出俩岸标查询寻结果
实际结果:
报错,提示realname_auth 未定义。我按照修改后的代码更新拓展JS文件,可以正常运行。
报错,提示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() 方法过滤掉无效的关联数据,确保数据安全。
m***@163.com (作者)
毫无疑问,是官方的代码呀
2025-06-27 21:53
DCloud_uniCloud_CRL
回复 m***@163.com: 这是哪个插件的代码呢?
2025-07-01 14:23