Класс Node.js с пакетом MySQL с использованием принципов ООП

Я изучаю, как работать с MySQL в узле, и это чистая боль.

Пакет npm называется «mysql». Я делаю приложение, которое следует принципам ООП, и я пытался создать независимый класс, который будет обрабатывать мои запросы к БД. У меня проблема в том, что я не могу разорвать соединение с моей базой данных, так как такие методы, как connection.end() или connection.drop(), не работают должным образом даже после их включения в .then

Вот как это выглядит:

    class DB {
    constructor(dbname, dbpassword) {
        this.dbname = dbname;
        this.dbpassword = dbpassword;
    }

    connection() {
        return new Promise((resolve, reject) => {
            resolve(mysql.createConnection({
                host: "localhost",
                user: "root",
                password: this.dbpassword,
                database: this.dbname,
            }))
        })
    }

    connect() {
        this.connection().then(res => {
            res.connect(function (err) {
                if (err) throw err;
                console.info(res.state, "connected")
            })
        })
    }

    dropConnection() {
        this.connection().then(res => {
            res.end(); console.info(res.state, 'connection dropped');
        })
    }
}

по какой-то причине я не могу разорвать соединение, как хотел. Способ res.end() не работает. Я просто хочу знать, если: а) Я поступаю правильно, пытаясь уместить все в одном классе и вызывая свои действия метод за методом (я пытаюсь следовать принципам ООП, поскольку у меня может быть несколько БД, которые будут выполнять почти одинаковые задачи). б) Что-то не так с моим кодом, чего я не вижу.

Каждый вызов connection() создает новую связь. Итак, вы вызываете connect(), создаете новое соединение и делаете что-то еще. Затем вы звоните dropConnection(), который также вызывает connection() и устанавливает второе соединение, а затем вы закрываете второе соединение.

Taplar 23.12.2020 19:32

Моя первая интуитивная реакция заключалась бы в том, что когда вы создаете соединение, сохраняйте его в экземпляре класса. Повторные вызовы connect должны возвращать одно и то же соединение. Когда вы вызываете dropConnection, закройте соединение, если оно существует, и обнулите его. В противном случае ничего не делать

Taplar 23.12.2020 19:33

Спасибо @Taplar! Как бы вы сохранили его в экземпляре класса? Не могли бы вы уточнить?

qurquru 23.12.2020 19:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
2 518
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

class DB {
  constructor(dbname, dbpassword) {
    this.establishedConnection = null;
    this.dbname = dbname;
    this.dbpassword = dbpassword;
  }

  connection() {
    return new Promise((resolve, reject) => {
      resolve(mysql.createConnection({
        host: "localhost",
        user: "root",
        password: this.dbpassword,
        database: this.dbname,
      }))
    })
  }

  connect() {
    if (!this.establishedConnection) {
      this.establishedConnection = this.connection().then(res => {
        res.connect(function(err) {
          if (err) {
            this.dropConnection();
            throw err;
          }
          
          console.info(res.state, "connected")
        })
      });
    }
  }

  dropConnection() {
    if (this.establishedConnection) {
      this.establishedConnection.then(res => {
        res.end();
        console.info(res.state, 'connection dropped');
      });
      
      this.establishedConnection = null;
    }
  }
}
  • У constructor() есть новое свойство класса establishedConnection, которое будет обещанием, возвращающим соединение.
  • Когда вызывается connect(), если нет установленного соединения, оно создаст новое
  • Если есть проблема с соединением, он вызовет метод dropConnection()
  • Когда вызывается метод dropConnection(), если есть установленное соединение, он попытается выполнить закрытие, а затем аннулирует его.

у меня теперь есть вопрос. Настраивает ли наше соединение как доступное свойство нашего класса, как это, против абстракции ООП, или в этом конкретном случае все в порядке?

qurquru 24.12.2020 09:00

@qurquru Можете ли вы уточнить свои рассуждения о том, что предоставление доступа к свойствам объекта является антиобъектно-ориентированным программированием? Если бы все объекты не имели доступных свойств, в чем был бы их смысл? Имея в виду, что методы объекта также являются «свойствами». Имя каждого из ваших методов является свойством экземпляра класса. Они просто указывают на функции.

Taplar 24.12.2020 18:37

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