Я пытаюсь подключиться к базе данных 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.
Есть ли решение? Буду ли я просто исправлять одну ошибку, чтобы меня приветствовала другая? Я просто трачу свое время?
@ChristopherJones Я обновил код, чтобы показать весь файл, так как init_database()
вызывается в последней строке. Я также далее объяснил, что я имею в виду под «похоже, не работает». Пожалуйста, дайте мне знать, если есть более подробная информация, которую я должен включить. Я включил все, что я знаю, чтобы включить.
@ChristopherJones СПАСИБО! Я действительно думал, что включил достаточно подробностей, но копнул глубже и смог решить проблему!
После извлечения 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/…)
@ChristopherJones Я перечитываю документ и вижу, что там тот же материал. Здесь я подумал, что строка в блоге о людях, не читающих документы, была резкой. Ржу не могу! Я бы сказал, что блог «читается» лучше. Это было больше похоже на прохождение шагов с меньшим количеством места для (неправильного) толкования. Должен признаться, до сегодняшнего дня у меня было так много проблем с этим, что я пролистывал. Я сдался, пока кто-то не прокомментировал «подробные инструкции», на которые я ссылался выше. Я проверю репо, на которое вы ссылаетесь. Еще раз спасибо!
Формат блога допускает менее формальный подход. Когда документ будет обновлен, я посмотрю, может ли он быть лучше. Некоторые из ваших базовых проблем исчезнут, когда у нас будет режим node-oracledb Thin, см. github.com/oracle/node-oracledb/issues/1533
Спасибо. Я просто подписался на тему.
Определите «похоже, что это не работает». Что за сообщение об ошибке
err
? Куда вы на самом деле звонитеinit_database()
? (Обновите свой вопрос с деталями.)