最近在公司鼓搗一個小型項目,技術棧選用了Vue2.0+Nodejs+Express+Mongodb+linux,須要訪問的數據在公司生產庫裏面,生產庫使用的是Oracle。直接訪問生產庫獲取數據太危險,因此須要定時從Oracle生產庫中抽取加工後的數據而後寫入到Mongodb中。nodejs操做Oracle數據庫這件事想一想就以爲必定是閒人才這麼幹,一番搜索後在github發現了竟然有Oracle官方維護的模塊oracledb,參考官方文檔步驟配置後始終提示:javascript
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,服!。但仔細留意在官方文檔中有這麼一句話:html
Instant Client on Windows requires an appropriate Visual Studio Redistributable. On Linux, the libaio (sometimes called libaio1) package is needed.
不少朋友碰到NJS-045錯誤應該是沒安裝libaio依賴,這裏將成功安裝過程記錄以下:java
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...node
gcc版本建議在5.0以上,ubuntu deskptop安裝後會自帶編譯器套件,使用gcc --version查看:
linux
設置環境變量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
git
Oracle官網下載如下兩個壓縮包
instantclient-basic-linux.x64-12.2.0.1.0.zip
instantclient-sdk-linux.x64-12.2.0.1.0.zip
文件解壓後兩個文件夾沒有重名的文件因此可直接合並
將壓縮包拷貝到/opt/oracle中解壓github
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
npm
在opt目錄下新建oracletest目錄並安裝oracledbmkdir oracletest
cd oracletest
sudo cnpm install oracledb
這裏建議使用cnpm,npm安裝會出現錯誤。ubuntu
在/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
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
ORA-24454: client host name is not set
配置hosts文件解決sudo /bin/bash -c "echo '127.0.1.1 ${HOSTNAME}' >> /etc/hosts"