Я изучаю, как работать с 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()
не работает.
Я просто хочу знать, если:
а) Я поступаю правильно, пытаясь уместить все в одном классе и вызывая свои действия метод за методом (я пытаюсь следовать принципам ООП, поскольку у меня может быть несколько БД, которые будут выполнять почти одинаковые задачи).
б) Что-то не так с моим кодом, чего я не вижу.
Моя первая интуитивная реакция заключалась бы в том, что когда вы создаете соединение, сохраняйте его в экземпляре класса. Повторные вызовы connect
должны возвращать одно и то же соединение. Когда вы вызываете dropConnection, закройте соединение, если оно существует, и обнулите его. В противном случае ничего не делать
Спасибо @Taplar! Как бы вы сохранили его в экземпляре класса? Не могли бы вы уточнить?
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 Можете ли вы уточнить свои рассуждения о том, что предоставление доступа к свойствам объекта является антиобъектно-ориентированным программированием? Если бы все объекты не имели доступных свойств, в чем был бы их смысл? Имея в виду, что методы объекта также являются «свойствами». Имя каждого из ваших методов является свойством экземпляра класса. Они просто указывают на функции.
Каждый вызов
connection()
создает новую связь. Итак, вы вызываете connect(), создаете новое соединение и делаете что-то еще. Затем вы звонитеdropConnection()
, который также вызываетconnection()
и устанавливает второе соединение, а затем вы закрываете второе соединение.