最近几周,我一直在尝试从我的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),为了我的目的,似乎很重要。
答案 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;
还阻止对其他所有包和过程的调用。根据您采取的路径,有几种方法可以做到这一点。
确保至少执行此操作:
你有它......没有必要担心模块是否会破坏或停止使用下一个版本。
AND ...您可以轻松地从Oracle与Node进行通信:
答案 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;
现在我的查询工作了!