解决Error: NJS-045错误 ubuntu环境配置Nodejs访问Oracle

最近在公司鼓捣一个小型项目,技术栈选用了Vue2.0+Nodejs+Express+Mongodb+linux,需要访问的数据在公司生产库里面,生产库使用的是Oracle。直接访问生产库获取数据太危险,所以需要定时从Oracle生产库中抽取加工后的数据然后写入到Mongodb中。nodejs操作Oracle数据库这件事想想就觉得一定是闲人才这么干,一番搜索后在github发现了居然有Oracle官方维护的模块oracledb,参考官方文档步骤配置后始终提示:

NJS-045: cannot load the oracledb add-on binary for Node.js or DPI-1047: Oracle Client library cannot be loaded, then review any messages and the installation instructions.

一路爬坑终于配置成功,这里还是要小小吐槽一下node-oracledb官方文档对这个NJS-045错误的描述和帮助信息有些不友好,配置过程中如果缺少依赖会提示NJS-045,环境变量配置配置文件未初始化会提示NJS-045,nodejs和Oracle Instant Client运行环境冲突也是提示NJS-045,服!。但仔细留意在官方文档中有这么一句话:

Instant Client on Windows requires an appropriate Visual Studio Redistributable. On Linux, the libaio (sometimes called libaio1) package is needed.

很多朋友碰到NJS-045错误应该是没安装libaio依赖,这里将成功安装过程记录如下:

0.运行环境

OS: ubuntu desktop 16.04LTS
Nodejs: 8.10.0
Oracle db: Oracle Instant Client-12.2.0.1.0
gcc:(Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0
官方文档:https://oracle.github.io/node...
网络博客:https://better-coding.com/sol...

1.安装gcc编译器套件

gcc版本建议在5.0以上,ubuntu deskptop安装后会自带编译器套件,使用gcc --version查看:
图片描述

2.安装Nodejs并设置环境变量

设置环境变量
vi /etc/profile
编辑文件内容如下:
export NODEHOME=/opt/node-v8.10.0-linux-x64
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$NODEHOME/bin
vi保存退出
初始化profile文件
source /etc/profile

3.安装Oracle Instant Client

Oracle官网下载以下两个压缩包
instantclient-basic-linux.x64-12.2.0.1.0.zip
instantclient-sdk-linux.x64-12.2.0.1.0.zip
文件解压后两个文件夹没有重名的文件所以可直接合并
将压缩包拷贝到/opt/oracle中解压

cd /opt/oracle
unzip instantclient-basic-linux.x64-12.2.0.1.0.zip
unzip instantclient-sdk-linux.x64-12.2.0.1.0.zip
mv instantclient_12_2 instantclient
cd instantclient
ln -s libclntsh.so.12.1 libclntsh.so

设置环境变量
vi /etc/profile
export LD_LIBRARY_PATH=/opt/oracle/instantclient:$LD_LIBRARY_PATH
export OCI_LIB_DIR=/opt/oracle/instantclient
export OCI_INC_DIR=/opt/oracle/instantclient/sdk/include
图片描述

vi保存退出
初始化配置文件
source /etc/profile

4.安装oracledb

在opt目录下新建oracletest目录并安装oracledb
mkdir oracletest
cd oracletest
sudo cnpm install oracledb
这里建议使用cnpm,npm安装会出现错误。

5.编写js文件访问数据库

在/opt/oracletest中新建一个测试的demo.js文件,用于访问oracle数据库。

var oracledb = require('oracledb');
var config = {
  user:'mytest', //访问数据的账号
  password:'password', //访问数据库的密码
  connectString : "192.168.0.107:1521/orcl" //数据库的ip地址和端口号,orcl是数据库中配置的service_name的值
};
oracledb.getConnection(
  config,
  function(err, connection)
  {
    if (err) {
      console.error(err.message);
      return;
    }
    connection.execute("SELECT * from temp where rownum<5",
      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);
      }
    });
}

上面示例中返回的Oracle数据库查询结果是一个数组,官方有异步执行返回Object对象的示例,参考这个:https://github.com/oracle/nod...

小心翼翼地编辑完demo.js文件然后保存,夹紧蛋蛋,满心欢喜地执行 node demo.js

图片描述

图片描述

6.关于NJS-045报错的解决办法

1.检查是否安装libaio1库,libaio1是Linux下的一个异步非阻塞接口,它提供了以异步非阻塞方式来读写文件的方式,读写效率比较高。缺少这个库会提示NJS-045错误。
sudo apt-get install libaio1
2.检查环境变量设置是否生效,环境变量设置后必须执行source /etc/profile初始化配置文件
3.检查当前系统的nodejs的环境变量是否配置到/etc/profile文件中
export NODEHOME=/opt/node-v8.10.0-linux-x64
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$NODEHOME/bin
同样修改后必须执行source /etc/profile初始化配置文件
4.检查/opt/oracle目录是否有读写权限,使用sudo chmod -R 777 提升权限
5.检查/opt/oracletest目录是否有读写权限,使用sudo chmod -R 777 提升权限
6.再次执行node demo.js

7.其他可能会遇到的错误

ORA-24454: client host name is not set
配置hosts文件解决
sudo /bin/bash -c "echo '127.0.1.1 ${HOSTNAME}' >> /etc/hosts"


x868086
89 声望5 粉丝