Node.js 方法中带有承诺的NodeJS类
我从NodeJS开始,已经写了几天代码了。现在我正在创建一个新的Winston传输,以便使用MSSQL或OracleDB作为日志目的地 我决定创建一个DB类来管理DB的连接、插入等 我的想法是在构造函数中声明一个连接(null),然后使用方法创建连接、插入等 但是,由于连接是异步的,Winston transport调用log方法,因此我需要创建连接,插入并关闭(或保持连接打开) 所以我用了这个:Node.js 方法中带有承诺的NodeJS类,node.js,Node.js,我从NodeJS开始,已经写了几天代码了。现在我正在创建一个新的Winston传输,以便使用MSSQL或OracleDB作为日志目的地 我决定创建一个DB类来管理DB的连接、插入等 我的想法是在构造函数中声明一个连接(null),然后使用方法创建连接、插入等 但是,由于连接是异步的,Winston transport调用log方法,因此我需要创建连接,插入并关闭(或保持连接打开) 所以我用了这个: class db { constructor(){ this.conne
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在每个函数中返回?事实上,它到处都会给我带来错误:(返回值都在各自的函数中。我更新了我的示例,使其不使用箭头函数,以便更好地阅读。