从nodejs连接oracle
Posted
技术标签:
【中文标题】从nodejs连接oracle【英文标题】:Connect oracle from nodejs 【发布时间】:2013-09-09 10:15:56 【问题描述】:过去几周我一直在尝试从我的 nodejs 代码连接 oracle db。到目前为止,我发现有两个主要库,例如 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)
我一直遵循两个驱动程序的安装过程并设置了变量 像这样(/var/environment)
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,node版本是v0.10.18 这是我的示例 nodejs 测试文件:
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),它似乎对我的目的来说太重了。
【问题讨论】:
【参考方案1】:我知道这是一篇旧帖子...只是想提一下 nodejs 无需额外模块即可与 oracle 通信的可靠方法。
设置 oracle 以便它可以创建和接收 http 请求。有几种方法可以做到这一点:
最简单的就是开启epg网关:
http://www.oracle-base.com/articles/10g/dbms_epg_10gR2.php你也可以设置 modplsq:
http://www.comp.dit.ie/btierney/oracle11gdoc/appdev.111/b28424/adfns_web.htm或 Apex 侦听器:
http://www.oracle.com/technetwork/developer-tools/apex-listener/overview/index.html?ssSourceSiteId=otnpt然后在node 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);
);
无论哪种方法...安全的预言机,以便它只响应 nodejs 服务器的 IP 地址。所以如果在 localhost 上运行:
if owa_util.get_cgi_env('REMOTE_ADDR') = '127.0.0.1' then
--ok
else
-- fail
end if;
还阻止对所有其他包和过程的调用。根据您采用的路径,有几种方法可以做到这一点。
确保您至少这样做:
创建可从网络调用的项目白名单 要求所有 url 都包含架构名称,例如:myuser.myprocedure 确保 url 的第一部分(直到查询路径)仅包含 a-z 0-9 真正好的白名单可以处理大部分这些项目你有它...无需担心模块是否会在下一个版本中中断或停止工作。
并且...您可以轻松地从 Oracle 通信到 Node 使用:
apex_web_service.make_rest_request utl_http【讨论】:
【参考方案2】:您是否获得了here 所述的即时客户端?如果我没看错,您需要 Basic(或 Basic Lite)和 SDK Instant Client 软件包。 SDK 包中可能包含您遇到问题的头文件。
旁注:根据我的经验,您并不总是需要将 Instant Client 添加到 PATH
;您通常只需确保您的可执行文件可以找到它(这通常意味着只需将其放在同一目录中)就可以逃脱。
【讨论】:
实际上我最近设法连接到 Oracle。 PATH 是个问题。 @vaske 我尽量避免将 Oracle 的东西放在我的道路上。当不同的项目需要不同的客户时,它往往会成为一个问题。祝你好运。【参考方案3】:在启动 Node 应用程序之前,在命令提示符中设置 oracle 客户端路径,如下所示
设置 PATH=C:\oracle\app\oracle\instantclient_12_1;%PATH%
我遇到了上述问题,这解决了我的问题,我现在可以连接到 oracle 了。
但我仍然面临的一个问题是执行 select 语句。它总是返回错误。我能够毫无错误地执行 SP、创建语句和其他所有内容。我被困在这里,有点失望。
【讨论】:
【参考方案4】:据我了解,Set PATH 将您指定的字符串放在 Path 环境变量的开头。我一开始输入的是即时客户端文件夹路径。
C:\oracle\app\oracle\instantclient_12_1;
它修复了 oracle 绑定错误,但查询不起作用。然后,我在即时客户端路径之前添加了 vc11 文件夹路径,所以它看起来像这样:
C:\oraclexe\app\oracle\instantclient_12_1\vc11;C:\oraclexe\app\oracle\instantclient_12_1;
现在我的查询工作了!
【讨论】:
以上是关于从nodejs连接oracle的主要内容,如果未能解决你的问题,请参考以下文章
OracleOracle错误 ora-12514 检查以及解决方法