Node.js介绍

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。

V8引擎本身使用了一些最新的编译技术。这使得用Javascript这类脚本语言编写出来的代码运行速度获得了极大提升,又节省了开发成本。对性能的苛求是Node的一个关键因素。 Javascript是一个事件驱动语言,Node利用了这个优点,编写出可扩展性高的服务器。Node采用了一个称为“事件循环(event loop)”的架构,使得编写可扩展性高的服务器变得既容易又安全。提高服务器性能的技巧有多种多样。Node选择了一种既能提高性能,又能减低开发复杂度的架构。这是一个非常重要的特性。并发编程通常很复杂且布满地雷。Node绕过了这些,但仍提供很好的性能。

Node采用一系列“非阻塞”库来支持事件循环的方式。本质上就是为文件系统、数据库之类的资源提供接口。向文件系统发送一个请求时,无需等待硬盘(寻址并检索文件),硬盘准备好的时候非阻塞接口会通知Node。该模型以可扩展的方式简化了对慢资源的访问, 直观,易懂。尤其是对于熟悉onmouseover、onclick等DOM事件的用户,更有一种似曾相识的感觉。

虽然让Javascript运行于服务器端不是Node的独特之处,但却是其一强大功能。不得不承认,浏览器环境限制了我们选择编程语言的自由。任何服务器与日益复杂的浏览器客户端应用程序间共享代码的愿望只能通过Javascript来实现。虽然还存在其他一些支持Javascript在服务器端 运行的平台,但因为上述特性,Node发展迅猛,成为事实上的平台。

在Node启动的很短时间内,社区就已经贡献了大量的扩展库(模块)。其中很多是连接数据库或是其他软件的驱动,但还有很多是凭他们的实力制作出来的非常有用的软件。

node-shentongdb接口简介

node-shentongdb是访问神通数据库的Node.js数据库插件,开发者可以编写JavaScript脚本进行神通数据库的操作。node-shentongdb从访问Oracle的node-oracledb项目移植而来,两者保持使用的高度兼容。node-shentongdb依赖odpi接口和ACI接口与数据库进行交互,node-shentongdb目前能适配的node.js版本为node-v14 至 node-v20。

../../../../_images/lay.png

node-shentongdb安装

安装 Python

安装python2.7以上或者python3.x版本。确保在终端中执行python命令可正确执行。

Linux下安装

前提

需要有gcc/g++编译环境

安装 node.js

yum install nodejs

在官网下载二进制:https://nodejs.org/zh-cn/download/ 解压后设置path环境变量,确保node和npm可执行。

node-shentongdb在线编译

进入到node-shentongdb源码目录下,执行以下步骤:

1)执行:npm run buildbinary

编译二进制,执行完成后,在package目录下会生成Staging目录。

注解

这步会自动去国外网站下载node-x.x.x-headers.tar.gz,很容易出现下载失败,导致这一步编译失败。如果失败,请用下面的“node-shentongdb离线编译”章节替代。

2)执行:npm run buildpackage

执行完成后,在node-shentongdb源码目录下会生成shentongdb-5.3.0.tgz的一个压缩文件,开发者就可以用这个压缩文件进行安装了。

node-shentongdb离线编译

1)手动下载好与node版本匹配的node的头文件,该文件可以在非官网的其他网站轻松下载到,然后解压,如下载node-16.20.2-headers.tar.gz解压到/root/Desktop/111/node-v16.20.2

2)node-shentongdb源码目录里找到binding.gyp,配置node的头文件路径,如下图配置好node的头文件

../../../../_images/cofgpy.png

3)node-shentongdb源码目录下,执行: npm run buildbinary --nodedir=/root/Desktop/111/node-v16.20.2/include/node,预期结果如下图

../../../../_images/build1.png

4)node-shentongdb源码目录下,执行: npm run buildpackage,预期结果如下图, 执行完成后,在node-shentongdb源码目录下会生成shentongdb-5.3.0.tgz的一个压缩文件,开发者就可以用这个压缩文件进行安装了。

../../../../_images/build2.png

node-shentongdb 安装

  • 方式一:

执行npm install [your_dir_path]/shentongdb-5.3.0.tgz

  • 方式二:

执行:npm install --unsafe-perm=true --allow-root

执行时确保正确执行,执行完成后,build/Release/下后shentongdb.node文件生成。

注解

安装node-shentongdb,任选一种方式即可,方式一如果报权限问题,就采用方式二,方式二需要进入到node-shentongdb源码目录下执行命令。npm安装时会在当前目录下生成一个node_modules文件夹,里面有一个shentongdb的目录,这就是安装好的node-shentongdb。因此建议在应用程序所在目录下去执行安装。

注解

node-shentongdb编译依赖神通数据库的ACI库,因此确保当前的LD_LIBRARY_PATH路径中有所依赖的aci库文件。node-shentongdb驱动暂时未发布到npm平台,所以无法通过配置package.json在线安装package.json。

Windows下安装

前提

需要有vs编译环境.

安装 node.js

Windows下安装node.js有msi的安装包:

相对简单,可以下载installer,下载链接:https://nodejs.org/zh-cn/download/。下载后执行安装,安装完成后在cmd窗口中执行npm和node可正确执行即可。

node-shentongdb 编译

进入到node-shentongdb源码目录下,执行以下步骤:

1)执行:npm run buildbinary

编译二进制,执行完成后,在package目录下会生成Staging目录。

注解

这步会自动去国外网站下载node-x.x.x-headers.tar.gz,很容易出现下载失败,导致这一步编译失败。如果失败,请参照上述linux中的“node-shentongdb离线编译”章节,编译与linux中类似。

2)执行:npm run buildpackage

执行完成后,在node-shentongdb源码目录下会生成shentongdb-5.3.0.tgz的一个压缩文件,开发者就可以用这个压缩文件进行安装了。

node-shentongdb 安装

  • 方式一:

执行npm install [your_dir_path]/shentongdb-5.3.0.tgz

  • 方式二:

执行:npm install --unsafe-perm=true --allow-root

执行时确保正确执行,执行完成后,build/Release/下后shentongdb.node文件生成。

注解

安装node-shentongdb,任选一种方式即可,方式一如果报权限问题,就采用方式二,方式二需要进入到node-shentongdb源码目录下执行命令。npm安装时会在当前目录下生成一个node_modules文件夹,里面有一个shentongdb的目录,这就是安装好的node-shentongdb。因此建议在应用程序所在目录下去执行安装。

注解

node-shentongdb编译依赖神通数据库的ACI库,因此确保当前的PATH路径中有所依赖的aci库文件。node-shentongdb驱动暂时未发布到npm平台,所以无法通过配置package.json在线安装package.json。

查询node-shentongdb是否成功安装

../../../../_images/querypkg.png

安装成功,能看到如上图中的shentongdb包,并带有版本号,linux查询包与windows类似。

使用node-shentongdb的样例

# create table test( a int ,b varchar2(30)); # insert into test values(1,'aaaa');

将下来内容写入到node_stdb_test.js文件中

var shentongdb = require("shentongdb");
var config = {
  user:"sysdba",
  password:"szoscar55",
  connectString : "localhost:2003/osrdb"
};
shentongdb.getConnection(
  config,
  function(err, connection)
  {
    if (err) {
      console.error(err.message);
      return;
    }
    connection.execute("SELECT * from TEST",
      function(err, result)
      {
        if (err) {
          console.error(err.message);
          doRelease(connection);
          return;
        }
        //打印返回的表结构
        console.log(result.metaData);
        //打印返回的行数据
        console.log(result.rows);
      });
  });

function doRelease(connection)
{
  connection.close(
    function(err) {
      if (err) {
        console.error(err.message);
      }
    });
}

执行node_stdb_test.js

node node_stdb_test.js

执行成功打印如下:

[root@qt596 opt]# node node_stdb_test.js [ { name: 'A' }, { name: 'B' } ] [ [ 1, 'aaaa' ] ]