From 589203ade9a73e704b7ec92e2ca458121811920c Mon Sep 17 00:00:00 2001 From: DCloud_Heavensoft Date: Thu, 1 Dec 2022 14:32:33 +0800 Subject: [PATCH] Update jql-schema-ext.md --- docs/uniCloud/jql-schema-ext.md | 65 +++++++++++++++++---------------- 1 file changed, 34 insertions(+), 31 deletions(-) diff --git a/docs/uniCloud/jql-schema-ext.md b/docs/uniCloud/jql-schema-ext.md index 602462553..841c24c75 100644 --- a/docs/uniCloud/jql-schema-ext.md +++ b/docs/uniCloud/jql-schema-ext.md @@ -9,7 +9,9 @@ DB Schema 的json文件无法编程,可编程扩展的js将大大增强schema - 在HBuilderX项目下,在目录 uniCloud/database/ 下可以创建`${表名}.schema.ext.js`。 - 在uniCloud web控制台的数据库表管理界面,在schema.json旁边也有`${表名}.schema.ext.js`的在线管理。 -schema扩展js在规划中可以实现很多事情,目前仅上线数据库触发器功能,推荐开发者使用JQL数据库触发器来替代action云函数。 +schema扩展js在规划中可以实现很多事情,目前仅上线数据库触发器功能。 + +推荐开发者使用JQL数据库触发器来替代action云函数。 ## 数据库触发器@trigger @@ -263,14 +265,14 @@ module.exports { } } } -``` - - -### 在触发器内使用jql语法@using-jql-in-schema - -jql触发器内可以使用jql语法操作数据库。 - -我们现在增加一个阅读记录表,schema如下 +``` + + +### 在触发器内使用jql语法@using-jql-in-schema + +jql触发器内可以使用jql语法操作数据库。 + +我们现在增加一个阅读记录表,schema如下 为了不增加示例的复杂度,所有权限均设置为true,实际项目中切勿随意模仿。 @@ -290,44 +292,44 @@ jql触发器内可以使用jql语法操作数据库。 "bsonType": "string" }, "article_id": { - "bsonType": "string", + "bsonType": "string", "foreignKey": "article._id" }, "reader_id": { - "bsonType": "string", - "foreignKey": "uni-id-users._id", - "forceDefaultValue": { - "$env": "uid" + "bsonType": "string", + "foreignKey": "uni-id-users._id", + "forceDefaultValue": { + "$env": "uid" } } } } -``` - -使用jql语法可以自动验证客户端身份,仍以上述article表为例,在afterRead触发器内插入阅读记录。此时会将读者id插入到reader_id字段 - +``` + +使用jql语法可以自动验证客户端身份,仍以上述article表为例,在afterRead触发器内插入阅读记录。此时会将读者id插入到reader_id字段 + ```js module.exports = { trigger: { afterRead: async function ({ - where, + where, field, clientInfo - } = {}) { - const id = where && where._id - if(typeof id !== 'string' || !field.includes('content')) { - return + } = {}) { + const id = where && where._id + if(typeof id !== 'string' || !field.includes('content')) { + return } const dbJQL = uniCloud.databaseForJQL({ clientInfo }) await dbJQL.collection('article-view-log') - .add({ - article_id: id, - reader_id: dbJQL.getCloudEnv('$cloudEnv_uid') + .add({ + article_id: id, + reader_id: dbJQL.getCloudEnv('$cloudEnv_uid') }) } -} +} ``` ### 注意事项 @@ -339,8 +341,9 @@ module.exports = { - 通过jql的redis缓存读取的内容不会触发读触发器 - jql数据管理不会触发任何触发器 -#### 和action的关系 - -数据库触发器能实现很多常见的action功能,并且无需修改schema和数据库指令。 +#### 和action云函数的关系 -触发器的before会在所有action的before执行之前再执行,after会在所有action的after执行之后再执行。action无法捕获触发器抛出的错误。 \ No newline at end of file +- 数据库触发器比action云函数更安全,不会被前端错误指定。 +- 数据库触发器支持JQL语法。action云函数只支持使用传统MongoDB方式。 +- 数据库触发器能实现很多常见的action云函数功能,并且无需修改schema和数据库指令。 +- 如果同时使用数据库触发器和action云函数,注意触发器的before会在所有action的before执行之前再执行,after会在所有action的after执行之后再执行。action无法捕获触发器抛出的错误。 -- GitLab