Node-oracledb на M1 Mac

Я пытаюсь подключиться к базе данных Oracle моего университета. Я написал простой бэкенд, который работает на моем компьютере с Windows, но не могу заставить его работать на моем M1 Mac. Вы можете найти мой репозиторий здесь и вот его суть,

const express = require('express');
const oracledb = require('oracledb');
if (process.platform === 'darwin') {
    try {
      console.info("Success");
      oracledb.initOracleClient({libDir: process.env.HOME + '/Downloads/instantclient_19_8'});
    } catch (err) {
      console.info("Failure");
      console.error('Whoops!');
      console.error(err);
      process.exit(1);
    }
}
const dotenv = require('dotenv');
const app = express();
const PORT = 5000;
dotenv.config();
var cors = require('cors');
app.use(cors());
app.use(express.json());

app.listen(PORT, ()=>{console.info(`listen to port ${PORT}`);})

database_initialized = false

async function init_database() {
    // The following should be wrapped in a try/catch
    await oracledb.createPool({
        user: process.env.USER_NAME,
        password: process.env.DB_PASSWORD,
        connectionString: process.env.CONNECTION_STRING
    });
    console.info("Successfully created connection pool");
    database_initialized = true
}

app.get('/', (req,res) => {
    res.send('Hello world!');
});

app.get('/get-customers', (req,res) => {
    async function fetchDataCustomers(){
        try {
            const connection = await oracledb.getConnection();

            oracledb.outFormat = oracledb.OUT_FORMAT_ARRAY;

            const query = process.env.QUERY_STR;;

            const result = await connection.execute(query);
            console.info("Completed request");
            
            try {
                await connection.close();
            }
            catch (err) {
                console.info("Encountered an error closing a connection in the connection pool.");
            }
            
            return result;
        } catch (error) {
            return error;
        }
    }

    fetchDataCustomers().then(dbRes => {
        res.send(dbRes);
    })
    .catch(err => {
        res.send(err);
    })
})

init_database();

Я нашел кого-то, кто был достаточно любезен, чтобы предоставить подробные инструкции по использованию Rosetta для переключения на x64-версию nvm, но моя oracledb.createPool() функция, похоже, не работает на моем M1 Mac (это работает на моем компьютере с Windows). Под этим я подразумеваю, что блок try терпит неудачу и переходит в блок catch и печатает «прослушать порт 5000», за которым следует повторная печать сообщения console.info. Других сообщений об ошибках на терминал не выводится.

На моем M1 Mac я следую инструкциям по ссылке и запускаю nvm use intel и node -e 'console.info(process.arch)', чтобы убедиться, что я использую x64. На обеих машинах я могу запустить:

  • npm init -y
  • npm i --save express
  • npm i --save-dev nodemon dotenv oracledb cors
  • и node server.js для проверки соединения.

На моем компьютере с Windows я подключаюсь и затем могу перейти к проверке созданной мной конечной точки (здесь она не указана, но ее можно увидеть в репозитории github, на который я ссылался выше). На моем M1 Mac я просто получаю сообщение в блоке catch о том, что произошла ошибка. Я хочу иметь возможность подключаться к базе данных Oracle с моего M1 Mac, но, похоже, у меня еще нет навыков, чтобы разобраться в этом самостоятельно. Любая помощь будет оценена по достоинству.

Обновлять: После вытаскивания oracledb.createPool() из try/catch я получил следующее:

listen to port 5000
(node:47913) UnhandledPromiseRejectionWarning: Error: DPI-1047: Cannot locate a 64-bit Oracle Client library: "dlopen(libclntsh.dylib, 0x0001): tried: 'libclntsh.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OSlibclntsh.dylib' (no such file), '/usr/local/lib/libclntsh.dylib' (errno=62), '/System/Volumes/Preboot/Cryptexes/OS/usr/local/lib/libclntsh.dylib' (no such file), '/usr/lib/libclntsh.dylib' (no such file, not in dyld cache), 'libclntsh.dylib' (no such file), '/usr/local/lib/libclntsh.dylib' (errno=62), '/usr/lib/libclntsh.dylib' (no such file, not in dyld cache)". See https://oracle.github.io/node-oracledb/INSTALL.html for help
Node-oracledb installation instructions: https://oracle.github.io/node-oracledb/INSTALL.html
You must have the 64-bit Oracle Instant Client Basic or Basic Light package libraries in
/usr/local/lib or set by calling oracledb.initOracleClient({libDir: "/my/instant_client_directory"}).
Oracle Instant Client can be downloaded from https://www.oracle.com/database/technologies/instant-client/macos-intel-x86-downloads.html

    at processTicksAndRejections (internal/process/task_queues.js:95:5)
    at async init_database (/Users/my-name/workspaces/node-oracle-test-project/back-end/server.js:30:5)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:47913) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)
(node:47913) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Затем я снова побежал npm install oracledb, и я получаю

oracledb ********************************************************************************
oracledb ** Node-oracledb 5.5.0 installed in Node.js 19.3.0 (darwin, x64)
oracledb **
oracledb ** To use node-oracledb:
oracledb ** - Oracle Client libraries (64-bit) must be available.
oracledb ** - Follow the installation instructions:
oracledb **   https://oracle.github.io/node-oracledb/INSTALL.html#instosx
oracledb ********************************************************************************

Итак, я перехожу по ссылке и пытаюсь найти, как установить библиотеки Oracle Client.

Я следую инструкциям здесь, но я не знаю, как действовать дальше. Я запустил /Volumes/instantclient-basic-macos.x64-19.8.0.0.0dbru/install_ic.sh как там написано но мне некуда переместить Instantclient_19_8 чтобы он был доступен. Я попытался переместить instantclient_19_8 в /Users/brian, но это не помогло устранить сообщение об ошибке.

Я нашел это и добавил предложенное условие в свой код. Получение новой ошибки.

(node:51947) UnhandledPromiseRejectionWarning: Error: ORA-24415: Missing or null username.
    at async init_database (/Users/brian/workspaces/node-oracle-test-project/back-end/server.js:42:5)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:51947) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:51947) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Есть ли решение? Буду ли я просто исправлять одну ошибку, чтобы меня приветствовала другая? Я просто трачу свое время?

Определите «похоже, что это не работает». Что за сообщение об ошибке err? Куда вы на самом деле звоните init_database()? (Обновите свой вопрос с деталями.)

Christopher Jones 05.02.2023 23:45

@ChristopherJones Я обновил код, чтобы показать весь файл, так как init_database() вызывается в последней строке. Я также далее объяснил, что я имею в виду под «похоже, не работает». Пожалуйста, дайте мне знать, если есть более подробная информация, которую я должен включить. Я включил все, что я знаю, чтобы включить.

Brian.H 06.02.2023 01:07

@ChristopherJones СПАСИБО! Я действительно думал, что включил достаточно подробностей, но копнул глубже и смог решить проблему!

Brian.H 06.02.2023 02:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
95
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После извлечения oracledb.createPool() из try/catch я получил следующее:

listen to port 5000
(node:47913) UnhandledPromiseRejectionWarning: Error: DPI-1047: Cannot locate a 64-bit Oracle Client library: "dlopen(libclntsh.dylib, 0x0001): tried: 'libclntsh.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OSlibclntsh.dylib' (no such file), '/usr/local/lib/libclntsh.dylib' (errno=62), '/System/Volumes/Preboot/Cryptexes/OS/usr/local/lib/libclntsh.dylib' (no such file), '/usr/lib/libclntsh.dylib' (no such file, not in dyld cache), 'libclntsh.dylib' (no such file), '/usr/local/lib/libclntsh.dylib' (errno=62), '/usr/lib/libclntsh.dylib' (no such file, not in dyld cache)". See https://oracle.github.io/node-oracledb/INSTALL.html for help
Node-oracledb installation instructions: https://oracle.github.io/node-oracledb/INSTALL.html
You must have the 64-bit Oracle Instant Client Basic or Basic Light package libraries in
/usr/local/lib or set by calling oracledb.initOracleClient({libDir: "/my/instant_client_directory"}).
Oracle Instant Client can be downloaded from https://www.oracle.com/database/technologies/instant-client/macos-intel-x86-downloads.html

    at processTicksAndRejections (internal/process/task_queues.js:95:5)
    at async init_database (/Users/my-name/workspaces/node-oracle-test-project/back-end/server.js:30:5)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:47913) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)
(node:47913) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Затем я повторно запустил npm install oracledb и получил

oracledb ********************************************************************************
oracledb ** Node-oracledb 5.5.0 installed in Node.js 19.3.0 (darwin, x64)
oracledb **
oracledb ** To use node-oracledb:
oracledb ** - Oracle Client libraries (64-bit) must be available.
oracledb ** - Follow the installation instructions:
oracledb **   https://oracle.github.io/node-oracledb/INSTALL.html#instosx
oracledb ********************************************************************************

Я следовал инструкциям здесь , чтобы установить Instant Client, но на самом деле нашел это более простым для выполнения (потому что я перестал читать документ, когда подумал, что получил то, что мне нужно). Есть проблема с получением моих учетных данных от моего .env, которую мне нужно выяснить, но я считаю, что это выходит за рамки моего исходного поста. Это будет работать до тех пор, пока значения process.env жестко запрограммированы. (Я знаю. Исправление — это следующий шаг.) Я обновлю репозиторий GitHub, ссылку на который я дал в исходном посте, и, надеюсь, другим будет проще, чем мне.

Обновление: проблема .env оказалась проблемой с тем, где я ее хранил. На моем компьютере с Windows я смог поместить его в родительский каталог (близкий к моему .gitignore), но на моем Mac мне пришлось поместить его в каталог back-end.

Я рад, что вы решили проблему. Я написал этот блог и документ. Что вы предпочли в блоге? Дайте мне знать, чтобы я мог улучшить документ. (PS вам может понравиться github.com/oracle-samples/oracle-db-examples/tree/main/…)

Christopher Jones 06.02.2023 03:08

@ChristopherJones Я перечитываю документ и вижу, что там тот же материал. Здесь я подумал, что строка в блоге о людях, не читающих документы, была резкой. Ржу не могу! Я бы сказал, что блог «читается» лучше. Это было больше похоже на прохождение шагов с меньшим количеством места для (неправильного) толкования. Должен признаться, до сегодняшнего дня у меня было так много проблем с этим, что я пролистывал. Я сдался, пока кто-то не прокомментировал «подробные инструкции», на которые я ссылался выше. Я проверю репо, на которое вы ссылаетесь. Еще раз спасибо!

Brian.H 06.02.2023 03:58

Формат блога допускает менее формальный подход. Когда документ будет обновлен, я посмотрю, может ли он быть лучше. Некоторые из ваших базовых проблем исчезнут, когда у нас будет режим node-oracledb Thin, см. github.com/oracle/node-oracledb/issues/1533

Christopher Jones 06.02.2023 09:05

Спасибо. Я просто подписался на тему.

Brian.H 06.02.2023 15:14

Другие вопросы по теме