解决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目录并安装oracledbmkdir 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"
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。