从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的主要内容,如果未能解决你的问题,请参考以下文章

ArcGis连接oracleoracle配置

ArcGis连接oracleoracle配置

OracleOracle错误 ora-12514 检查以及解决方法

OracleOracle Database 12c Release 2安装多图详解

OracleOracle数据库多实例安装

从nodejs连接oracle