В предыдущем посте я представил быстрый способ сделать это с помощью Python. Настало время порадовать и разработчиков JavaScript или TypeScript!

Чтобы начать работу с вашей Всегда бесплатной автономной базой данных, прочитайте публикацию Тодда.

Затем щелкните значок Cloud Shell в правом верхнем углу веб-консоли OCI (Oracle Cloud Infrastructure). Это открывает оболочку Linux прямо внутри вашего браузера! Первый запуск может занять более одной минуты, чтобы настроить его. У вас будет до 5 ГБ памяти и множество предустановленных инструментов…

Теперь самое интересное… Чтобы запустить тестовую программу, которая будет отображать дату и время, вам нужно скачать и разархивировать кошелек Autonomous Database.

$ oci db autonomous-database generate-wallet --autonomous-database-id ocid1.autonomousdatabase.oc1.eu-frankfurt-1.abtheljtcwfhy5ohok66arn6ngrpqdigvq7bzcpygtfnkbldvgtk4rv3xhtq --file wallet.zip --password My_Strong_Pa55word
$ unzip wallet.zip

Вам также необходимо настроить среду (переменная среды TNS_ADMIN), чтобы драйвер мог найти строку подключения, хранящуюся в файле tnsnames.ora.

$ pwd
$ export TNS_ADMIN=/home/loic_lefev
$ sed -i 's/?\/network\/admin/$TNS_ADMIN/' sqlnet.ora

А как насчет Node.js?

Это очень хороший вопрос, поскольку по умолчанию (и на сегодняшний день) мы устанавливаем версию v10.21.0.

Чтобы установить нужную версию, вы можете использовать команду nvm:

Интересными командами являются:

$ nvm ls-remote --lts

Первая команда перечисляет доступные версии, включая поддержку Long-Term S.

$ nvm install 15.0.0 --latest-npm

Эта вторая команда устанавливает заданную версию (здесь 15.0.0) и также обновляет npm до последней версии:

Теперь, когда у нас есть нужная версия, давайте продолжим, используя npm, на этот раз для установки драйвера oracledb Node.js:

$ npm install oracledb

Следующую программу можно скопировать и вставить прямо в файл с именем select.js:

'use strict';
const oracledb = require('oracledb');
async function run() {
 let connection;
 
 try {
    connection = await oracledb.getConnection({
     user: process.env.NODE_ORACLEDB_USER || "USERNAME",
     password: process.env.NODE_ORACLEDB_PASSWORD || "PASSWORD",
     connectString: process.env.NODE_ORACLEDB_CONNECTIONSTRING || "CONNECTIONSTRING"
   });
      let result = await connection.execute('select sysdate from dual');
console.log(result.rows[0]);
 } catch (err) {
   console.error(err);
 } finally {
   if (connection) {
     try {
    await connection.close();
     } catch (err) {
    console.error(err);
     }
   }
 }
}
 
run();

Затем, чтобы запустить его, мне нужно установить переменные среды:

$ export NODE_ORACLEDB_USER=dragon
$ export NODE_ORACLEDB_PASSWORD=My_Strong_Pa55word
$ export NODE_ORACLEDB_CONNECTIONSTRING=dragon_tp

А затем запустите программу:

$ node select.js

Хорошо, но что это за Polyglot Node.js, о котором вы упомянули в заголовке?

Рад, что ты спросил :D

На самом деле есть еще один классный способ запускать приложения Node.js: использовать замечательную GraalVM, предоставляющую возможности полиглота.

В следующем примере мы запустим код Java из этого приложения Node.js, это очень простой пример.

Во-первых, давайте установим версию сообщества GraalVM с открытым исходным кодом в OCI Cloud Shell:

$ wget https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.2.0/graalvm-ce-java8-linux-amd64-20.2.0.tar.gz
$ tar -xvf graalvm-ce-java8-linux-amd64-20.2.0.tar.gz
$ export PATH=/home/loic_lefev/graalvm-ce-java8-20.2.0/bin:$PATH

Приведенный выше код загружает текущую версию GraalVM CE и добавляет к пути каталог bin.

Теперь вы увидите, что версия Node.js изменилась:

Мы действительно не в последнем выпуске, но сейчас мы эффективно используем GraalVM при вызове команды узла.

Затем давайте напишем Java-код (сохраните это содержимое в файле с именем JavaQueryProvider.java):

public class JavaQueryProvider {
    public static String getCurrentDateTime() {
        return "select sysdate from dual";
    }
}

Этот очень простой класс имеет статический метод, возвращающий SQL-запрос, который мы будем использовать в нашем скрипте Node.js. Для запуска GraalVM потребуется Java-архив, поэтому давайте создадим sqlqueries.jar:

$ javac JavaQueryProvider.java
$ ls *.class
$ jar -cvf sqlqueries.jar JavaQueryProvider.class

В программе JavaScript нам нужно внести небольшое изменение (выделено жирным шрифтом):

'use strict';
const oracledb = require('oracledb');
async function run() {
 let connection;
 
 try {
    connection = await oracledb.getConnection({
     user: process.env.NODE_ORACLEDB_USER || "USERNAME",
     password: process.env.NODE_ORACLEDB_PASSWORD || "PASSWORD",
     connectString: process.env.NODE_ORACLEDB_CONNECTIONSTRING || "CONNECTIONSTRING"
   });
   let result = await connection.execute( Java.type('JavaQueryProvider').getCurrentDateTime() );
   console.log(result.rows[0]);
 } catch (err) {
   console.error(err);
 } finally {
   if (connection) {
     try {
    await connection.close();
     } catch (err) {
    console.error(err);
     }
   }
 }
}
 
run();

Этот код попросит GraalVM запустить только что скомпилированный код Java, а затем вернет строку, содержащую фактический код SQL для запуска.

Будет ли это работать?…… Конечно! :D

$ node --vm.cp sqlqueries.jar select.js

Аккуратный! Ну и что дальше? Как насчет того, чтобы открыть для себя все инновации JSON, которые Oracle привнесла в мир баз данных?