解决方案Error:NJS-045errorubuntuenvironmentconfigurationNodejsaccessOracle最近在公司做一个小项目,技术栈选择了Vue2.0+Nodejs+Express+Mongodb+linux,需要访问的数据在公司的生产库中,生产库使用的是Oracle。直接访问生产数据库获取数据太过危险,所以需要定期从Oracle生产数据库中提取处理后的数据写入Mongodb。一想到nodejs操作oracle数据库,我想肯定是闲人做的。一番查找后,在github中发现居然有Oracle官方维护的一个模块oracledb。参考官方文档步骤和配置后,总是提示:NJS-045:cannotloadtheoracledbadd-onbinaryforNode.js或DPI-1047:OracleClientlibrarycannotbeloaded,然后查看任何消息和安装说明.Theoracledbadd-onbinaryforNode.jsorDPI-1047:一路爬坑,终于配置成功,这里还是有点吐槽官方的node-oracledb文档这个NJS的描述和帮助信息-045错误有点不友好。如果配置过程中缺少依赖,会提示NJS-045。环境变量配置配置文件未初始化。NJS-045,收下吧!.但是要密切注意官方文档中的这句话:InstantClientonWindowsrequiresanappropriateVisualStudioRedistributable。在Linux上,需要libaio(有时称为libaio1)包。很多朋友遇到NJS-045错误应该是没有安装libaio依赖,这里记录安装成功过程如下:0.运行环境OS:ubuntudesktop16.04LTSNodejs:8.10.0Oracledb:OracleInstantClient-12.2.0.1.0gcc:(Ubuntu5.4.0-6ubuntu1~16.04.10)5.4.0官方文档:https://oracle.github.io/node...网络博客:https://better-coding.com/sol...1.安装gcc编译套件gcc版本建议5.0以上,ubuntudeskptop安装后会有自己的编译套件,使用gcc--version查看:2.安装Nodejs并设置环境变量设置环境变量vi/etc/profile编辑文件内容如下:exportNODEHOME=/opt/node-v8.10.0-linux-x64PATH=$PATH:$HOME/.local/bin:$HOME/bin:$NODEHOME/binvi保存退出初始化配置文件source/etc/profile3.安装OracleInstantClientoracle官网下载如下两个压缩包instantclient-basic-linux.x64-12.2.0.1.0.zipinstantclient-sdk-linux.x64-12.2.0.1.0.zip解压后两个文件夹没有文件同名,所以可以直接合并复制到/opt/oracle解压cd/opt/oracleunzipinstantclient-basic-linux.x64-12.2.0.1.0.zipunzipinstantclient-sdk-linux.x64-12.2.0.1.0.zimpv即时client_12_2instantclientcdinstantclientln-slibclntsh.so.12.1libclntsh.so设置环境变量vi/etc/profileexportLD_LIBRARY_PATH=/opt/oracle/instantclient:$LD_LIBRARY_PATHexportOCI_LIB_DIR=/opt/oracle/instantclientexportOCI/ind_dirk=/includevi保存退出初始化配置文件来源/etc/profile4.安装oracledb在opt目录下新建oracletest目录并安装oracledbmkdiroracletestcdoracletestsudocnpminstalloracledb这里推荐使用cnpm,npm安装会报错5.在/opt中编写访问数据库的js文件创建测试demo.js/oracletest中的文件以访问oracle数据库。varoracledb=require('oracledb');varconfig={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*fromtempwhererownum<5",function(err,result){if(err){console.error(err.message);doRelease(connection);return;}//打印返回表结构console.log(result.metaData);//打印返回行数据console.log(result.rows);});});functiondoRelease(connection){connection.close(function(err){if(err){console.error(err.message);}});}上面例子返回的Oracle数据库查询结果是一个数组。官方有异步执行返回Object对象的例子。参考这个:https://github.com/oracle/nod...仔细编辑demo.js文件并保存,夹鸡蛋,用joy6执行nodedemo.js。关于NJS-045错误的解决方法1.检查是否安装了libaio1库、libaio1是Linux下的异步非阻塞接口。它提供了一种以异步和非阻塞方式读写文件的方法。读写效率比较高。如果缺少此库,将提示NJS-045错误。sudoapt-get安装libaio12。检查环境变量设置是否有效。设置环境变量后,必须执行source/etc/profile初始化配置文件。3、查看/etc/profile文件中是否配置了当前系统nodejs环境变量。exportNODEHOME=/opt/node-v8.10.0-linux-x64PATH=$PATH:$HOME/.local/bin:$HOME/bin:$NODEHOME/binsource/etc/profile初始化配置文件后也必须修改4.检查/opt/oracle目录是否有读写权限,使用sudochmod-R777提权5.检查/opt/oracletest目录是否有读写权限,使用sudochmod-R777提权权限6.再次执行nodedemo.js7.其他可能遇到的错误ORA-24454:clienthostnameisnotset配置hosts文件解决sudo/bin/bash-c"echo'127.0.1.1${HOSTNAME}'>>/etc/hosts"
