7.8 Node.js兼容框架

Limax集成原生java版本node.js兼容框架,使用JDK8提供的Nashorn引擎,依据node.js手册的描述实现,并做了适当扩展,以利于集成到Limax框架中,为连接Limax外的系统提供便利。

Nashorn支持ES5.1标准,对于某些ES6标准的js文件,应该首先使用6to5工具转换,现有Node.js手册示例都是ES6代码,应该转换以后实验。

以下的描述,符合node.js 6文档的顺序,便于对比。


  • 7.8.2 增强模块

    长期以来,node.js被诟病最多问题的就是缺乏持久化能力与管理能力。Java能够轻松解决这些问题,所以扩充两个模块sql和edb,分别提供关系数据库,键值对数据库访问能力,扩充一个简单JMX查询模块monitor。

    • Sql

      • sql.Connection类

        • ‘close’ 事件

        • connection.execute(statement [,parameter1[,parameter2…]], callback)

        • connection.destroy()

      • sql.createConnection(url)


      Sql.Connection类

      提供数据库连接,内部实现为连接池,不活动的连接1分钟淡出。


      var url = 'jdbc:mysql://192.168.1.3:3306/test?user=root&password=admin&autoReconnect=true'
      var sql = require("sql");
      var conn = sql.createConnection(url);
      conn.once('close', function() {
          console.log('closed')
      });
      conn.execute("select * from a where id > ?", 1, function(err) {
          if (err) {
              console.log(err);
              return;
          }
          var s = '!';
          for (var i = 1; i < arguments.length; i++)
              s += arguments[i] + ' ';
          console.log(s)
      });
      conn.destroy();
      

      ‘close’ 事件

      执行destroy,关闭数据库连接,但是关闭时可能还有活动连接存在,所有的活动连接结束以后触发该事件,表示数据库连接彻底关闭。


      connection.execute(statement [,parameter1[,parameter2…]], callback)

      statement <String> 符合jdbc规范的sql语句,用?占位

      parameter <Object> 该参数的个数必须和statement中的占位符个数相等

      callback <Function> 结果回调

      parameter通过PreparedStatement.setObject()方法设置到查询请求中,能接受的类型取决于应用数据库的JDBC连接库,一般来说int类型string类型没有问题,其它类型必须通过实际测试决定,小心long,js的long只有53位有效位。最坏情况下,可以重新设计sql语句,支持string参数,使用数据库自身的convert函数将string转换为目标类型。

      callback第一个参数是err,这一点与node.js习惯一致。SELECT使用的callback参数数量取决于查询语句本身返回的列数,查询语句返回N列,那么使用N+1个参数进行回调。查询语句可能返回空集,所以为了表示查询结束,最后一次callback传入0个参数,可以通过arguments.length = 0检测查询结束,所以上面的例子,最后一行输出总是单字符”!”。返回结果的类型思考与paramter一致,如果返回了不可识别的类型,考虑修改sql语句使用数据库自身的convert转换为string。UPDATE,DELETE,INSERT,这一类操作用2个参数调用callback一次,第二个参数为影响的行数。


      connection.destroy()

      结束数据库连接,destroy之后的execute调用直接用连接已经关闭的错误回调。


      sql.createConnection(url)

      url <String> 数据库连接url

      创建数据库连接的便捷方法。


    • Edb

      • edb.Instance类

        • ‘close’ 事件

        • instance.addTable(table1, [,table2 [,table3 …]], callback)

        • instance.removeTable(table1, [,table2 [,table3 …]], callback)

        • instance.insert(table, key, value, callback)

        • instance.replace(table, key, value, callback)

        • instance.remove(table, key, callback)

        • instance.find(table, key, callback)

        • instance.exist(table, key, callback)

        • instance.walk(table, [,from], callback)

        • instance.destroy()

      • edb.createEdb(path)


      edb.Instance类

      edb对象实例,提供键值对数据库访问操作。

      首先,必须创建目录’/work/js.test/dbhome’,Edb不会自动创建。


      var edb = require('edb').createEdb('/work/js.test/dbhome');
      edb.once('close', function() { console.log('close')});
      edb.addTable('a', function() {
          var n = 3;
          function insert3() {
              if (--n > 0)
                  return;
              edb.find('a', '1', console.log);
              edb.walk('a', '0', console.log);
              edb.destroy();
          }
          edb.insert('a', '0', 'AA', insert3);
          edb.insert('a', '1', 'b', insert3);
          edb.insert('a', '3','',insert3);
      });
      

      注意一下这段代码的并行特性,3个insert操作并行,完成以后find与walk操作并行,之后destroy关闭数据库,禁止后续查询操作。


      ‘close’ 事件

      执行destroy,关闭Edb实例,但是关闭时可能还有操作正在执行,所有的操作执行结束以后触发该事件,表示Edb实例彻底关闭。


      instance.addTable(name1, [,name2 [,name3 …]] , callback)

      name <String> 往数据库中添加的表名

      callback <Function>

      一次可以添加多个表,执行完成callback被调用,如果有错误第一个参数为Exception信息。数据库中已有该表,操作忽略。


      instance.removeTable(name1, [,name2 [,name3 …]] , callback)

      name <String> 从数据库中删除的表名

      callback <Function>

      一次可以删除多个表,执行完成callback被调用,如果有错误第一个参数为Exception信息。数据库中该表不存在,操作忽略。


      instance.insert(table, key, value, callback)

      table <String> 表名

      key <Buffer|String>

      value <Buffer|String>

      callback <Function>

      插入一个键值对,key或者value如果为String,在内部用utf8编码为Buffer后执行。

      callback(err, succeed);如果key在表中已经存在succeed == false,插入失败。


      instance.replace(table, key, value, callback)

      table <String> 表名

      key <Buffer|String>

      value <Buffer|String>

      callback <Function>

      替换一个键值对,key或者value如果为String,在内部用utf8编码为Buffer后执行。

      callback(err)。key在表中不存在执行插入,存在则替换。


      instance.remove(table, key, callback)

      table <String> 表名

      key <Buffer|String>

      callback <Function>

      删除一个键值对,key如果为String,在内部用utf8编码为Buffer后执行。

      callback(err)。key在表中不存在,操作忽略,不作为错误。


      instance.find(table, key, callback)

      table <String> 表名

      key <Buffer|String>

      callback <Function>

      执行查找,key如果为String,在内部用utf8编码为Buffer后执行。

      callback(err, value)。key在表中不存在,value == null,value为Buffer类型


      instance.exist(table, key, callback)

      table <String> 表名

      key <Buffer|String>

      callback <Function>

      key如果为String,在内部用utf8编码为Buffer后执行。

      callback(err, value)。key在表中不存在,value == false


      instance.walk(table, [,from], callback)

      table <String> 表名

      from <Buffer|String>

      callback <Function>

      from如果为String,在内部用utf8编码为Buffer后执行。

      遍历表,如果有from参数,从from的下一个键值对开始遍历。

      callback(err, key, value)。key, value均为Buffer类型


      instance.destroy()

      关闭Edb实例连接,destroy之后执行的操作直接用实例已经关闭的错误回调。


      edb.createEdb(path)

      创建Edb实例的便捷方法,应用必须保证path目录存在,否则会抛出异常,结束当前代码片段的执行。


上一页 下一页