解決Error: NJS-045錯誤 ubuntu環境配置Nodejs訪問Oracle

解決Error: NJS-045錯誤 ubuntu環境配置Nodejs訪問Oracle

最近在公司鼓搗一個小型項目,技術棧選用了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

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...node

1.安裝gcc編譯器套件

gcc版本建議在5.0以上,ubuntu deskptop安裝後會自帶編譯器套件,使用gcc --version查看:
圖片描述linux

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/profilegit

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中解壓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/profilenpm

4.安裝oracledb

在opt目錄下新建oracletest目錄並安裝oracledb
mkdir oracletest
cd oracletest
sudo cnpm install oracledb
這裏建議使用cnpm,npm安裝會出現錯誤。ubuntu

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"

相關文章
相關標籤/搜索