4

过去几周我一直在尝试从我的 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

4 回答 4

5

我知道这是一篇旧文章……只是想提一下 nodejs 无需额外模块即可与 oracle 通信的可靠方法。

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

最简单的就是开启epg网关:

您还可以设置 modplsq:

或 Apex 侦听器:

然后在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;

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

确保至少这样做:

  • 创建可以从 Web 调用的项目的白名单
  • 要求所有 url 包含架构名称,例如:myuser.myprocedure
  • 确保 url 的第一部分(直到查询路径)仅包含 az 0-9
  • 一个好的白名单真的会处理大部分这些项目

有了它...无需担心模块是否会在下一个版本中损坏或停止工作。

并且...您可以轻松地从 Oracle 通信到 Node 使用:

  • apex_web_service.make_rest_request
  • utl_http
于 2014-02-19T13:41:00.437 回答
0

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

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

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

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

于 2014-09-22T07:44:30.950 回答
0

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

C:\oracleexe\app\oracle\instantclient_12_1;

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

C:\oracle\app\oracle\instantclient_12_1\vc11;C:\oracle\app\oracle\instantclient_12_1;

现在我的查询工作了!

于 2015-01-19T16:37:55.660 回答
0

您是否获得了此处所述的即时客户端?如果我没看错,您需要 Basic(或 Basic Lite)和 SDK Instant Client 软件包。SDK 包可能包含您遇到问题的头文件。

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

于 2013-11-01T00:40:25.423 回答