Соединитель NodeJS / MariaDB — createConnection() не возвращает правильный объект подключения

#mysql #node.js #mariadb

#mysql #node.js #mariadb

Вопрос:

Node.js устанавливается в следующей версии на моем компьютере Ubuntu 18/04:

   node -v
  v14.16.0
 

Установлены следующие модули:

   sudo npm list -g --depth=0
  /usr/lib
  ├── mariadb@2.5.3
  └── npm@6.14.11
 

Требуемый пакет

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

 const mariadb = require('mariadb');
let conn = mariadb.createConnection({
     host: 'localhost', 
     database: 'db1',
     user:'dbuser1', 
     password: 'dbpwd',
     port: 3306
});

conn.connect(function(err){
  if(err){
    console.log('Database connection error');
  }else{
    console.log('Database connection successful');
  }
});

 

Требуемый пакет ‘mariadb’ удовлетворен, и createConnection () не возвращает ошибку.
Однако, переходя к оператору connect(), NodeJS возвращает следующее:

 conn.connect(function(err){
     ^

TypeError: conn.connect is not a function
    at Object.<anonymous> (/home/juerg/bin/node/maria.js:12:6)

 

Похоже, что createConnection() возвращает пустой JS-объект. Любой другой метод класса подключения также не будет работать, и я не могу обнаружить ошибку в этом коротком фрагменте кода.

Ответ №1:

mariadb.createConnection возвращает обещание, поэтому вам нужно будет, чтобы await оно вернуло соединение, например:

 let conn = await mariadb.createConnection({
     host: 'localhost', 
     database: 'db1',
     user:'dbuser1', 
     password: 'dbpwd',
     port: 3306
});
 

Также может не быть необходимости вызывать conn.connect() отдельно, поскольку это уже сделано в createConnection : Исходный код

Или, если вы не хотите, чтобы ваша функция была асинхронной, вы можете сделать что-то вроде:

 mariadb.createConnection({
     host: 'localhost', 
     database: 'db1',
     user:'dbuser1', 
     password: 'dbpwd',
     port: 3306
}).then((conn) => {
     // Do here what you want to do with MySQL connection...
});
 

Комментарии:

1. К сожалению, это не работает: let conn = await mariadb.createConnection({ ^^^^^ SyntaxError: await также допустимо только в асинхронной функции, ни в одном из примеров это ключевое слово не используется.

2. Вам нужно будет создать вызывающую функцию async или вы можете использовать обещание (обновил исходный ответ).

3. Спасибо, Исмаил, оба решения решили мою проблему. Я бы хотел, чтобы в многочисленных примерах кода было более четкое указание на пункт обещания. Но теперь я надеюсь, что ваше решение поможет другим новичкам NodeJS..

4. Спасибо, юмайер, рад, что я смог помочь 🙂

Ответ №2:

Согласно документации MariaDB connector, существует два доступных API, Promise и Callback, Promise — это API по умолчанию, который вам требуется и который вы используете следующим образом.

 const mariadb = require("mariadb");
mariadb.createConnection({
     host: 'localhost', 
     database: 'database',
     user:'username', 
     password: 'password',
     port: 3306
}).then(conn => {
    // Execute a query/do whatever you need with the connection object here.
});
 

В качестве альтернативы, вы можете использовать API обратного вызова (который, следует отметить, предназначен для совместимости с модулями mysql и mysql2), изменив оператор require и затем подключившись следующим образом:

 const mariadb = require("mariadb/callback");
const conn = mariadb.createConnection({
     host: 'localhost', 
     database: 'database',
     user:'username', 
     password: 'password',
     port: 3306
});
conn.connect(err => {
    if (err) return console.log("Failed to connect");
    console.log(`Successfully connected to mariadb server: ${conn.serverVersion()}`);
});

// Execute a query/do whatever you need with the connection object here.