Connetti oracle da nodejs

Nelle ultime settimane ho cercato di connettere oracle db dal mio codice nodejs. Quello che ho trovato fino ad ora sono 2 librerie principali come https://github.com/mariano/node-db-oracle che non è aggiornato (l’ultimo aggiornamento è stato l’anno fa) e il secondo è https://github.com/ nearinfinity / node-oracle che è veramente aggiornato, tuttavia non sono riuscito a collegarmi a Oracle con nessuno di quei moduli.

Problema del sindaco che l’installazione di npm oracle // pr db-oracle non riesce a causa di

../src/connection.h:10:18: fatal error: occi.h: No such file or directory 

Ho provato a clonare il codice ed eseguire l’installazione locale e quindi copiare l’intero modulo sotto il mio progetto, installare bene wen, ma quando inserisco il modulo sotto il mio progetto mi imbatto in questo errore

  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. (/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) 

Ho seguito la procedura di installazione per entrambi i driver e sono state impostate variabili come questa (/ 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 

Ho usato Ubuntu 12.04 e la versione del nodo è la v0.10.18. Ecco il mio file di test nodejs di esempio:

 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'); }); }); 

ogni suggerimento aggiuntivo sarebbe bello. Ho provato noradle ( https://github.com/kaven276/noradle ) che sembra essere troppo pesante per il mio scopo.

So che questo è un vecchio post … volevo solo menzionare un modo sicuro per nodejs per comunicare a Oracle senza moduli aggiuntivi.

Imposta oracle in modo che possa creare e ricevere richieste http. Ci sono alcuni modi per farlo:

Il modo più semplice è accendere il gateway epg:

Inoltre puoi impostare modplsq:

o il listener Apex:

Quindi nel nodo js fai un http.get standard:

 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); 

});

Qualunque approccio … sicuro oracle in modo che risponderà solo all’indirizzo IP del server nodejs. Quindi se si esegue su localhost:

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

Inoltre, blocca le chiamate a tutti gli altri pacchetti e procedure. Ci sono alcuni modi per farlo a seconda del percorso che fai.

Assicurati di farlo al minimo:

  • crea una lista bianca di elementi che possono essere chiamati dal web
  • richiede che tutti gli URL contengano il nome dello schema come: myuser.myprocedure
  • assicurati che la prima parte dell’URL (fino al percorso della query) contenga solo 0-9
  • davvero una buona lista bianca si prenderà cura della maggior parte di questi articoli

Eccolo lì … non c’è bisogno di preoccuparsi se un modulo si romperà o smetterà di funzionare con la prossima versione.

E … puoi facilmente comunicare da Oracle a Node:

  • apex_web_service.make_rest_request
  • UTL_HTTP

Hai ricevuto il client istantaneo come descritto qui ? Se sto leggendo correttamente, sono necessari i pacchetti Basic (o Basic Lite) e SDK Instant Client. Il pacchetto SDK potrebbe avere il file di intestazione con cui hai problemi.

Nota a margine: nella mia esperienza, non è sempre necessario aggiungere Instant Client a PATH ; di solito puoi fare a meno di assicurarti che il tuo eseguibile possa trovarlo (il che spesso significa semplicemente lasciarlo nella stessa directory).

Impostare il percorso del client Oracle nel prompt dei comandi come di seguito prima di avviare l’applicazione Node

Imposta PATH = C: \ oraclexe \ app \ oracle \ instantclient_12_1;% PATH%

Ho avuto il problema di cui sopra, questo ha risolto il mio e ora sono in grado di connettermi a Oracle.

Ma l’unico problema che sto affrontando è l’esecuzione dell’istruzione select. Restituisce sempre un errore. Sono in grado di eseguire SP, creare dichiarazioni e tutto il resto senza errori. Sono bloccato qui e un po ‘deluso.

Da quanto ho capito, Set PATH inserisce la stringa specificata all’inizio della variabile di ambiente Path. Ho inserito il percorso della cartella del client istantaneo all’inizio.

C: \ OracleXE \ app \ oracle \ instantclient_12_1;

Risolve l’errore di associazione Oracle, ma le query non funzionavano. Quindi, ho aggiunto il percorso della cartella vc11 PRIMA del percorso del client istantaneo, quindi è simile a questo:

C: \ OracleXE \ app \ oracle \ instantclient_12_1 \ VC11; C: \ OracleXE \ app \ oracle \ instantclient_12_1;

Ora le mie query funzionano!