阿歪绅士
阿歪绅士
  • 发布:2026-05-08 11:48
  • 更新:2026-05-08 11:49
  • 阅读:94

给uni-id-users表添加beforeCreate和afterCreate两个触发器,在注册新用户时不能触发。beforeRead和afterRead可以触发,是什么原因呢?

分类:uniCloud

给uni-id-users表添加beforeCreate和afterCreate两个触发器,在注册新用户时不能触发。beforeRead和afterRead可以触发,是什么原因呢?
难道官方的新建用户操作不是用JQL写的吗?

module.exports = {
trigger: {
afterCreate: async function({
collection,
operation,
addDataList,
clientInfo
} = {}) {
console.log("建后触发器执行了")
},
beforeCreate: async function({
collection,
operation,
addDataList,
clientInfo
} = {}) {
console.log("键前触发器执行了")
},
afterRead: async function({
collection,
operation,
addDataList,
clientInfo
} = {}) {
console.log("读后触发器执行了")
}
}
}

2026-05-08 11:48 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uniCloud 官方技术交流群 ) 咨询,群中有相关专业的管理员和群友。

根据 uniCloud 官方文档和 DCloud 官方人员的多次回复,数据库触发器(包括 beforeCreateafterCreate仅在使用 JQL 语法操作数据库时才会触发,传统的 MongoDB 写法(如 db.collection('uni-id-users').add(...)不会触发这些触发器。

而 uni-id 在注册新用户时,内部使用的正是传统的 MongoDB 写法,并没有通过 JQL 来新增数据,所以你在 uni-id-users 表上定义的 beforeCreateafterCreate 触发器不会被触发。这是设计如此,不是 bug。

至于 beforeReadafterRead 能够触发,很可能是因为你的读取操作是通过客户端 clientDB(本质是 JQL)或者云函数中使用 databaseForJQL 进行的,因此符合触发条件。

相关依据:

  • DCloud 官方人员回复:“这个是因为 uni-id 写入数据表,没有使用 jql 写法而是使用传统 MongoDB 写法造成的。”(ask 社区 #163650
  • DCloud 官方人员回复:“只有 jql 操作才会触发数据库触发器,uni-id 没有使用 jql 语法。”(ask 社区 #178259
  • 官方文档:“仅限使用 JQL 来操作数据库,客户端和云端均可以执行 JQL。但使用传统 MongoDB 写法不支持数据库触发器。”(DB Schema 扩展 - 触发器

如果你需要在用户注册时执行某些逻辑,可以考虑以下方案:

  1. 使用 uni-id 的 hooks 体系(如 beforeRegisterafterRegister)来注册回调函数,这些是 uni-id 官方提供的扩展点。
  2. 在自己的业务代码中,使用 JQL 语法进行用户新增(需注意跳过触发器避免无限循环),但通常不推荐绕过 uni-id 的登录注册流程。

如果需要进一步了解触发器或 uni-id 钩子的使用,可查阅:

内容为 AI 生成,仅供参考

要回复问题请先登录注册