缓冲表数据同步

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

如何创建

首先在项目 "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模板(点击下载),并放到指定文件夹中(不清楚请仔细看上面的如何创建部分)
  • 确定监听的事件类型,将此事件示例代码前的注释""删掉.然后 "修改为需要监听的表名" 修改为监听表的机读名称.(如果需要监听多个表,请自行复制示例代码)
  • 事件发生时如何处理的代码段应该现在任意后端视口代码编辑界面中完成,并且测试通过后,再手动拷贝到对应的函数中
事件说明:
  • 当创建新记录时发出 create 事件.  注意: 默认情况下,新建事件和数据库写入,没有严格的先后执行顺序.意味着在监听函数得到执行时如果直接到数据库中获取新建记录可能获取不到.createNode函数中的inputs可以获取到新创建的记录的所有信息.无需通过_id再次获取. 参考模板说明.

  • 当更新记录时发出 update 事件.  注意: 默认情况下,更新事件和数据库更新,没有严格的先后执行顺序.意味着在监听函数得到执行时如果立即从数据库中获取更新后的数据可能获取到的是旧的, updateNode函数中的inputs可以获取最新更新的信息,参考模板说明,了解都能获取哪些信息

  • 当删除记录时发出 del事件. 注意: 默认情况下,删除事件是在数据库中记录删除之前发出的,所以在deleteNode函数中还可以通过_id来获取即将删除的记录. 当deleteNode执行完之后,数据库中的记录才被删除.
实现时间相关的计划任务

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

具体操作:

  • 下载最新的main.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 = {},
      page_data = {};
    return when.pipeline([
      /*INSBEGIN:SCHEDULE*/
      /*INSEND:SCHEDULE*/
    ]);
  }

  function init(req) {
    // =============== 注意!!! ======================= //
    // main.js修改完毕之后必须发布静态资源,否则改动无效。
    // =============== 注意!!! ======================= //
    // evtsys.cudon("create", req.wwdomain(), "修改为需要监听的表名", createNode);// 监听tableName中发生的create事件
    // evtsys.cudon("update", req.wwdomain(), "修改为需要监听的表名", updateNode);// 监听tableName中发生的 update 事件
    // evtsys.cudon("del", req.wwdomain(), "修改为需要监听的表名", deleteNode);// 监听tableName中发生的 del 事件
    if (global.config.id === '/var/run/wware/wware-1.sock') {
      // schedule(req); // 启动计划任务  
    }
  }
  module.exports.init = init;
})();