https://uniapp.dcloud.net.cn/uniCloud/jql.html 这个文档里面有下面这段描述
before在数据库操作执行前触发,before里的代码执行完毕后再开始操作数据库。before的常用用途:
对前端传入的数据进行二次处理
在此处开启数据库事务,万一操作数据库失败,可以在after里回滚
使用throw阻止运行
如果权限或字段值域校验不想配在schema和validateFunction里,也可以在这里做校验
after在数据库操作执行后触发,JQL操作数据库后触发after里的代码。after的常用用途:
对将要返回给前端的数据进行二次处理
也可以在此处处理错误,回滚数据库事务
对数据库进行二次操作,比如前端查询一篇文章详情后,在此处对文章的阅读数 1。因为permission里定义,一般是要禁止前端操作文章的阅读数字段的,此时就应该通过action,在云函数里对阅读数 1
然后下面有一段示例代码
// state参数格式如下
{
command: {
// getMethod('where') 获取所有的where方法,返回结果为[{$method:'where',$param: [{a:1}]}]
getMethod,
// getParam({name:'where',index: 0}) 获取第1个where方法的参数,结果为数组形式,例:[{a:1}]
getParam,
// setParam({name:'where',index: 0, param: [{a:1}]}) 设置第1个where方法的参数,调用之后where方法实际形式为:where({a:1})
setParam
},
auth: {
uid, // 用户ID,如果未获取或者获取失败uid值为null
role, // 通过uni-id获取的用户角色,需要使用1.1.9以上版本的uni-id,如果未获取或者获取失败role值为[]
permission // 通过uni-id获取的用户权限,需要使用1.1.9以上版本的uni-id,如果未获取或者获取失败permission值为[],注意登录时传入needPermission才可以获取permission,请参考 https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=rbac
},
// 事务对象,如果需要用到事务可以在action的before内使用state.transaction = await db.startTransaction()传入
transaction,
// 更新或新增的数据
newData,
// 访问的集合
collection,
// 操作类型,可能的值'read'、'create'、'update'、'delete'
type
}
我的理解是在before过程中要创建一个事物对象state.transaction = await db.startTransaction()?然后用这个事物对象操作别的库,在after阶段查看当前的库的数据有没有写入成功,如果写入成功调用transaction.commit()让事务结束,如果失败调用transaction.rollback()回滚,但是当前库的写入过程好像并不在这个事务内,假设一些极端的情况,比如数据已经写入了当前库,但是因为断电并没有来得及调用after,这样就导致了操作其他库的事务没有完成,但是当前库里已经有了数据。我这样理解对吗?
还有一个问题uniCloud.databaseForJQL函数好像并没有startTransaction函数没办法开启事务处理。
只有uniCloud.database里有,但是这个函数里面少了权限校验比较难用啊。
我能在云端使用uniCloud.database().startTransaction进行schema权限校验吗?
0 个回复