1. 服务端开发
  2. 触发器

触发器定义

触发器文件名称以.trigger.js结尾,格式如下:

module.exports = {
    listenTo: '对象API名称',
    beforeInsert: [async] Function,
    beforeUpdate: [async] Function,
    beforeDelete: [async] Function,
    beforeFind: [async] Function,
    afterInsert: [async] Function,
    afterUpdate: [async] Function,
    afterDelete: [async] Function,
}

listenTo

对象名称,选填。如果没有定义此属性,则取文件名中第一个 . 之前的文字作为listenTo的值,支持通过通配符指向多个对象。

事件前触发

事件前触发的触发器,可以用于校验用户录入的数据是否正确,如果有问题,可以抛错,错误信息会反馈到前端操作页面;还可以结合权限控制当前操作等。

事件前触发的触发器函数都是以before前缀命名。

  • beforeInsert
  • beforeUpdate
  • beforeDelete
  • beforeFind

事件后触发

事件后触发的触发器,可以用于执行关联的事件,比如任务创建完成后发送通知给指定人员。

事件前触发的触发器函数都是以after前缀命名。

  • afterInsert
  • afterUpdate
  • afterDelete

参数说明

所有脚本函数均为无参函数,所属数据可从this中获取,this结构如下

  • id: 记录的唯一标识[string],
  • userId: 当前用户唯一标识[string],
  • spaceId: 当前工作区[string],
  • doc: 需要新增/修改的记录内容[json],
  • previousDoc: 修改/删除前的记录[json], //仅afterUpdate, afterDelete时存在此属性
  • object_name: 当前对象名称[string],
  • datasource_name: 数据源名称[string],
  • getObject: function(object_name: string)
  • query: 查询数据相关参数[json], //仅beforeFind时存在此属性

触发器函数的返回值

  • 如果return的是false,则中断操作,如在before.insert里return false,则不执行insert操作。

触发器示例

beforeInsert: async function () {
    var doc = this.doc
    if (doc.code) {
        let count = await this.getObject('picklists').count({ filters: [['space', '=', doc.space], ['code', '=', doc.code]] })
        if (count > 0) {
            throw new Error("唯一编码不能重复");
        }
    }
},

创建触发器

  • 打开命令面板,在输入框中输入“Steedos:”,则会出现可选的命令列表,选择“Create Object Trigger”
  • 根据提示填写触发器名称并回车
  • 选择需要的trigger,例如 beforeInsert, beforeUpdate等,可多选,点击“OK”
  • 选择目标文件夹,默认是“triggers”文件夹下,选择该目录并回车,系统会生成触发器文件并保存到对应的文件夹中。
  • 在triggers.js文件中调整listenTo属性值;在指定触发器函数中编写相关代码。

注意事项

  • 同一个对象的同一个事件,可以在不同软件包中定义多个触发器。
  • 触发器所在的软件包中必须含有其对应的对象文件或者继承的对象文件。
  • 自定义对象触发器文件名不能携带 __c , 在触发器文件中需要手动配置listenTo的值:对象 API 名称。