从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;
现在我的查询工作!