Node.js 方法中带有承诺的NodeJS类

Node.js 方法中带有承诺的NodeJS类,node.js,Node.js,我从NodeJS开始,已经写了几天代码了。现在我正在创建一个新的Winston传输,以便使用MSSQL或OracleDB作为日志目的地 我决定创建一个DB类来管理DB的连接、插入等 我的想法是在构造函数中声明一个连接(null),然后使用方法创建连接、插入等 但是,由于连接是异步的,Winston transport调用log方法,因此我需要创建连接,插入并关闭(或保持连接打开) 所以我用了这个: class db { constructor(){ this.conne

我从NodeJS开始,已经写了几天代码了。现在我正在创建一个新的Winston传输,以便使用MSSQL或OracleDB作为日志目的地

我决定创建一个DB类来管理DB的连接、插入等

我的想法是在构造函数中声明一个连接(null),然后使用方法创建连接、插入等

但是,由于连接是异步的,Winston transport调用log方法,因此我需要创建连接,插入并关闭(或保持连接打开)

所以我用了这个:

class db {

    constructor(){
        this.connection = null;
    }

    connect(){

        return new Promise(function(resolve, reject){
            if (this.connection == null){
                if (config.Logging.DB.type == 'mssql'){

                    const dbOptions = {
                        user: config.Logging.DB.user,
                        password: config.Logging.DB.password,
                        server: config.Logging.DB.mssql.server,
                        database: config.Logging.DB.mssql.database,
                        options: {
                            encrypt: config.Logging.DB.encrypt
                        }
                    };

                    this.connection = new mssql.ConnectionPool(dbOptions, err => {
                        if (err) reject('Can\'t establish a DB connection.');
                        this.connection.connect(err => {
                            if (err) reject(err);
                            resolve();
                        });
                    });

                }
            }else{
                resolve();
            }
        });
    }

    insert(query){
        if (config.Logging.DB.type == 'mssql'){
            this.connection.request().query(query, err => {
                console.log(err);
            });
        }
    }

}
我的想法是在启动应用程序时创建一个db类实例,然后使用该打开的连接进行任何插入(每次winston调用log方法时),如下所示:

class DBTransport {
  connect() {
    if (!this._pool) {
      // Memoize (cache) the connection so you don't have to remake it every time
      this._pool = new Promise(function(resolve, reject) {
        const pool = new mssql.ConnectionPool(dbOptions);
        return pool.connect().then(function() {
          return pool;
        });
      });
    }
    return this._pool;
  }
  insert(query) {
    // Always refetch your connection
    return this.connect().then(function(pool) {
      return pool.request().query(query);
    })
  }
}
const db=require('./函数/db'); const db_instance=new db()

但这根本不起作用。首先,我在db类connect方法中遇到了一个错误,我试图访问promise中的“this.connection”,但我无法访问

我还希望保持连接打开,因为winston可能会多次调用log方法(我有一个进程会调用log方法超过5K次)

我确实尝试过使用一些可用的winston mssql传输。。。但它们都是更新的,不能与当前版本的winston一起使用


有人能帮忙吗?

您需要将承诺保存在连接功能之外,并每次按如下方式返回该备忘录承诺:

class DBTransport {
  connect() {
    if (!this._pool) {
      // Memoize (cache) the connection so you don't have to remake it every time
      this._pool = new Promise(function(resolve, reject) {
        const pool = new mssql.ConnectionPool(dbOptions);
        return pool.connect().then(function() {
          return pool;
        });
      });
    }
    return this._pool;
  }
  insert(query) {
    // Always refetch your connection
    return this.connect().then(function(pool) {
      return pool.request().query(query);
    })
  }
}

尝试了,但是我得到了“UnhandledPromisejectionWarning:Unhandled promise rejection”。添加了一些错误处理,我注意到我在insert中得到了一个错误:连接已关闭。奇怪,正如我在上面建议的那样打开连接。HMMM2在每个函数中返回?事实上,它到处都会给我带来错误:(返回值都在各自的函数中。我更新了我的示例,使其不使用箭头函数,以便更好地阅读。