从nodejs连接oracle

时间:2013-09-09 10:15:56

标签: sql oracle node.js oracle11g

最近几周,我一直在尝试从我的nodejs代码连接oracle db。到目前为止我发现的是2个主要的库,例如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,节点版本是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),为了我的目的,似乎很重要。

4 个答案:

答案 0 :(得分:5)

我知道这是一个老帖子...只是想提一个nodejs在没有额外模块的情况下与oracle通信的可靠方法。

设置oracle以便它可以创建和接收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地址。所以如果在localhost上运行:

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

还阻止对其他所有包和过程的调用。根据您采取的路径,有几种方法可以做到这一点。

确保至少执行此操作:

  • 创建可从网络调用的白色项目列表
  • 要求所有网址都包含架构名称,例如:myuser.myprocedure
  • 确保网址的第一部分(直到查询路径)仅包含a-z 0-9
  • 非常好的白名单将照顾大部分这些项目

你有它......没有必要担心模块是否会破坏或停止使用下一个版本。

AND ...您可以轻松地从Oracle与Node进行通信:

  • apex_web_service.make_rest_request
  • UTL_HTTP

答案 1 :(得分:0)

您是否按照here所述获得了即时客户端?如果我正确读取此内容,则需要Basic(或Basic Lite)和SDK Instant Client软件包。 SDK包可能包含您遇到问题的头文件。

附注:根据我的经验,您并不总是需要将Instant Client添加到PATH;您通常可以确保您的可执行文件可以找到它(这通常意味着将其放在同一目录中)。

答案 2 :(得分:0)

在启动Node应用程序之前,在命令提示符中设置oracle客户端路径,如下所示

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

我遇到了上述问题,这解决了我的问题,我现在能够连接到oracle。

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

答案 3 :(得分:0)

据我所知,Set PATH将您指定的字符串放在Path环境变量的开头。我在开头输入了即时客户端文件夹路径。

  

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

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

  

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

现在我的查询工作了!