从nodejs连接oracle

最近几个星期,我一直试图从我的nodejs代码连接oracle数据库。 到目前为止,我发现有两个主要的库,例如https://github.com/mariano/node-db-oracle ,这个库已经过期(最近一次更新是一年前),第二个是https://github.com/ nearinfinity / node-oracle这是真正的最新的,但是我没有设法连接oracle与任何这些模块。

npm install oracle // pr db-oracle的市长问题由于

../src/connection.h:10:18: fatal error: occi.h: No such file or directory 

我试图克隆代码,并执行本地安装,然后复制我的项目下的整个模块,安装好,但是当我把模块放在我的项目下,我遇到了这个错误

  module.js:340 throw err; ^ Error: Cannot find module './build/Release/oracle_bindings' at Function.Module._resolveFilename (module.js:338:15) at Function.Module._load (module.js:280:25) at Module.require (module.js:364:17) at require (module.js:380:17) at Object.<anonymous> (/var/www/node-test/node_modules/db-oracle/db-oracle.js:18:15) at Module._compile (module.js:456:26) at Object.Module._extensions..js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Module.require (module.js:364:17) 

我一直在遵循安装程序的两个驱动程序,并已设置variables像这样(/ var /环境)

 OCI_HOME=/opt/instantclient_12_1 OCI_VERSION=12 OCI_INCLUDE_DIR=/opt/instantclient_12_1/sdk/include OCI_LIB_DIR=/opt/instantclient_12_1 LD_LIBRARY_PATH=/usr/lib/oracle/12.1/client/lib 

我用的Ubuntu的12.04,和节点版本是v0.10.18这里是我的示例nodejstesting文件:

 var oracle = require('oracle'); new oracle.Database({ hostname: 'myserver.com', port: 1521, user: 'myuser', password: 'mypass', database: 'XE' }).connect(function(error) { if (error) { return console.log("CONNECTION ERROR: " + error); } this.query("select * FROM `store`").execute(function(error, rows) { if (error) { return console.log('ERROR: ' + error); } console.log(rows.length + ' ROWS'); }); }); 

任何额外的提示将是很好的。 我试过noradle( https://github.com/kaven276/noradle ),似乎是为了我的目的而沉重。

我知道这是一个旧的post…只是想提到一个确定的方式nodejs沟通到甲骨文没有额外的模块。

设置oracle,以便它可以创build和接收http请求。 有几种方法可以做到这一点:

最简单的是打开epg网关:

你也可以设置modplsq:

或者Apex的听众:

然后在js节点上做一个标准的http.get:

 http.get("http://localhost/accessor/myschema.my_procedure?x=1&y=2", function(res) { console.log("Got response: " + res.statusCode); }).on('error', function(e) { console.log("Got error: " + e.message); 

});

无论哪种方法…安全oracle,以便它只会响应nodejs服务器的IP地址。 所以如果在本地主机上运行:

 if owa_util.get_cgi_env('REMOTE_ADDR') = '127.0.0.1' then --ok else -- fail end if; 

也阻止对其他包裹和程序的呼叫。 有几种方法可以做到这一点取决于你的path。

确保你至less做到这一点:

  • 创build一个可以从networking上调用的项目的白名单
  • 要求所有的URL包含模式名称,例如:myuser.myprocedure
  • 确保url的第一部分(直到查询path)只包含az 0-9
  • 真的很好的白名单将照顾这些项目的大部分

在那里你可以…无需担心模块是否会中断或停止使用下一个版本。

和…你可以很容易地从甲骨文沟通节点使用:

  • apex_web_service.make_rest_request
  • UTL_HTTP

你有没有得到这里描述的即时客户端? 如果我正确阅读,则需要基本(或基本Lite)和SDK即时客户端软件包。 SDK包可能有你遇到的头文件。

附注:根据我的经验,您并不总是需要将即时客户端添加到PATH ; 你通常可以逃脱只是确保你的可执行文件可以find它(这往往意味着把它放在同一个目录中)。

在启动Node应用程序之前,在下面的命令提示符中设置oracle客户机path

设置PATH = C:\ oraclexe \ app \ oracle \ instantclient_12_1;%PATH%

我有上面的问题,这解决了我的问题,我现在可以连接到甲骨文。

但是我仍然面临的一个问题是执行select语句,它总是返回错误。 我能够执行SP,创build语句和其他所有内容,而不会出错。 我被困在这里,有点失望。

据我所知,设置PATH把你指定的string放在Path环境variables的开头。 我开始时进入了即时客户端文件夹path。

C:\ oraclexe \应用\ ORACLE \ instantclient_12_1;

它修复了oracle绑定错误,但查询不起作用。 然后,我添加了即时客户端path之前的vc11文件夹path,所以它看起来像这样:

C:\ oraclexe \应用\ ORACLE \ instantclient_12_1 \ VC11; C:\ oraclexe \应用\ ORACLE \ instantclient_12_1;

现在我的查询工作!