main.js是针对全站的处理脚本能够处理诸如: 数据缓存,时间相关的计划任务等.

注意:对项目lib/middle文件夹内文件发送变动(目前当修改main.js或者job文件会涉及到),请使用<<技术任务更新通知>>的六条发送邮件

如何创建

在wide的站点编辑页面,点击编辑->新建业务功能(事件类型:文件名为main.js,对应功能的启动方式为当前进程的事件。通常用于支持同步缓冲数据等进程事件驱动的业务逻辑功能。)

ps:在项目 "lib" 目录下任意目录中的main.js都会被执行到.可以根据需求创建多个main.js,以目录区分.因为模块中也会有main.js是,其main.js是放在以模块名命名的目录中的.所以项目中新建目录的时候需要避免与模块名重复例如 auth, email 等

模板说明(可结合最下方示例模板体会)
  • 模板中是注释了所有的事件监听,如果需要监听某个事件,就取消对应行的注释(删除行首的//)
  • "evtsys.cudon("create",...." 是监听指定表发生新建动作,处理函数应该在 "createNode" 函数中插入
  • "evtsys.cudon("update",...." 是监听指定表发生更新动作,处理函数应该在 "updateNode" 函数中插入
  • "evtsys.cudon("del",...." 是监听指定表发生删除动作,处理函数应该在 "deleteNode" 函数中插入
    • 注意,发生记录删除事件的时候,记录还未被删除,如果需要获取记录信息,请自行通过 inputs.id作为记录的_id来获取将要删除的记录的详细数据.
实现数据缓存

在标准数据库(ES)中所进行的 "创建(C)", "更新(U)", "删除(D)" 操作都会发出对应的系统事件.而在main.js中是可以监听到这些事件,并做一些处理. 缓存表的数据维护就是基于这个特性的. 监听数据发生变动的表中的 CUD 事件, 进而更新缓存表中对应的数据. 实现起来可以用一句话总结: "当 xxx 表,发生 xxx 事件时,做 xxx 处理".

具体操作:

  • 创建对应的main.js并编辑
  • 添加事件(点击事件->添加)
  • 编辑事件(点击代码->选择对应事件)
    • 编辑事件和平时写接口没有差异(增加事件发生时如何处理的代码段)
  • 提示:如果业务逻辑是在main.js中是可以监听到这些事件,并更新一些表,可以在代码编辑中选择应用模板中的更新缓冲表的模板,根据业务逻辑和模板说明修改对应字段
实现时间相关的计划任务

例如 "每周三15点10分 做xxx","三天后 做xxx". 都是计划任务.

具体操作:

  • 创建mail.js,创建事件并编辑
  • 删掉 "schedule(req);"前的注释"".
  • 事件发生时如何处理的代码段应该现在任意后端视口代码编辑界面中完成,并且测试通过后,再手动拷贝到 schedule 函数中代码插入点中" /*INSBEGIN:SCHEDULE*/此间为代码插入点 /*INSEND:SCHEDULE*/"

模板(只用于展示,如果使用请按步骤按下载最新版本)

/*
version=0.1
*/
(function() {
  var evtsys = reqlib("evtsys");
  
  function createNode(doc, database) {
    /* inputs 变量中属性解释:
    inputs : {
      "index": "test.com", // 站点域名
      "type": "test", // 表名
      "id": "f93e14aff53aec98b896c9ce03f42a28", // 新建记录的 _id
      "body": { // 新建记录的所有数据
        "id": "id",
        "name": "name"
        }
    }
    */
    var tmp_data = {},
        inputs = doc,
        page_data = {},
        req = {
                database: function() {return database;}
        };
    return when.pipeline([
      /*INSBEGIN:ONCREATED*/
      /*INSEND:ONCREATED*/
    ]);
  }

  function updateNode(doc, database) {
        /* inputs 变量中属性解释:
    inputs =  {
        "index": "test.com", // 站点域名
        "type": "test", // 表名
        "id": "f93e14aff53aec98b896c9ce03f42a28", // 新建记录的 _id
        "body": {
          "doc": {
            "id": "id",
            "name": "name"
          }
        }
      }
    */
    var tmp_data = {},
        inputs = doc,
        page_data = {},
        req = {
          database: function() {return database;}
        };
    return when.pipeline([
      /*INSBEGIN:ONUPDATED*/
      /*INSEND:ONUPDATED*/
    ]);
  }

  function deleteNode(doc, database) {
    // !!! 注意,发生记录删除事件的时候,记录还未被删除,如果需要获取记录信息,请自行通过 inputs.id作为记录的_id来获取将要删除的记录的详细数据.
    /* inputs 变量中属性解释:
     inputs =  {
        "index": "test.com", // 站点域名
        "type": "test", // 表名
        "id": "f93e14aff53aec98b896c9ce03f42a28", // 删除记录的 _id
      }
    */
    var tmp_data = {},
        inputs = doc,
        page_data = {},
        req = {
          database: function() {return database;}
        };
    return when.pipeline([
      /*INSBEGIN:ONDELETED*/
      /*INSEND:ONDELETED*/
    ]);
  }
  function schedule(req){
    var tmp_data = {},
        inputs = doc,
        page_data = {};
    return when.pipeline([
      /*INSBEGIN:SCHEDULE*/
      /*INSEND:SCHEDULE*/
    ]);    
  }
  function init(req) {
    // evtsys.cudon("create", req.wwdomain(), "修改为需要监听的表名", createNode);// 监听tableName中发生的create事件
    // evtsys.cudon("update", req.wwdomain(), "修改为需要监听的表名", updateNode);// 监听tableName中发生的 update 事件
    // evtsys.cudon("del", req.wwdomain(), "修改为需要监听的表名", deleteNode);// 监听tableName中发生的 del 事件
    // schedule(req); // 启动计划任务
  }
  module.exports.init = init;
})();