【问题标题】:Node.js class with MySQL package using OOP principles使用 OOP 原理的带有 MySQL 包的 Node.js 类
【发布时间】:2021-04-02 08:46:56
【问题描述】:

我正在学习如何在 Node 中使用 MySQL,这很痛苦。

npm 包是“mysql”。 我正在制作一个遵循 OOP 原则的应用程序,并且我正在尝试制作一个独立的类来处理我的数据库请求。我遇到的问题是我无法断开与数据库的连接,因为 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.log(res.state, "connected")
            })
        })
    }

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

由于某种原因,我无法按照我的意愿断开连接。方法res.end() 不起作用。 我只想知道是否: a)我通过尝试将所有内容放在一个类中并按方法调用我的操作方法来做正确的事情(我正在尝试遵循 OOP 原则,因为我可能有多个数据库将执行几乎相似的任务)。 b) 我的代码有问题,我看不到。

【问题讨论】:

  • 每次调用connection() 都会创建一个新连接。所以你调用connect(),然后你建立一个新的连接,然后做一些事情。然后你调用dropConnection(),它也调用connection()并建立第二个连接,然后你关闭第二个连接
  • 我的第一反应是,当您创建连接时,将其存储在类实例中。重复调用connect 应该返回相同的连接。当您调用 dropConnection 时,请关闭连接(如果存在)并将其清空。否则,什么都不做
  • 谢谢@Taplar!您将如何将其存储在类实例中?能详细点吗?

标签: javascript mysql node.js oop npm


【解决方案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.log(res.state, "connected")
        })
      });
    }
  }

  dropConnection() {
    if (this.establishedConnection) {
      this.establishedConnection.then(res => {
        res.end();
        console.log(res.state, 'connection dropped');
      });
      
      this.establishedConnection = null;
    }
  }
}
  • constructor() 有一个新的类属性 establishedConnection,它将是返回连接的承诺
  • connect()被调用时,如果没有建立连接,它会建立一个新的
  • 如果连接有问题,会调用dropConnection()方法
  • 在调用dropConnection()方法时,如果有已建立的连接,它会尝试执行关闭,然后将其清空

【讨论】:

  • 我现在有一个问题。像这样针对 OOP 的抽象将我们的连接设置为我们类的可访问属性还是这种特殊情况可以?
  • @qurquru 您能否详细说明您的推理,即使对象上的属性可访问是反面向对象的编程?如果所有对象都没有可访问的属性,那么它们的意义何在?请记住,对象上的方法也是“属性”。每个方法的名称都是类实例的属性。它们恰好指向函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 2020-10-05
  • 2016-11-28
  • 2014-07-20
  • 2015-03-10
  • 2020-01-22
相关资源
最近更新 更多