为什么当调用成员函数时,将MySQL池分配给成员变量会恢复为未定义



我想创建一个连接池,供每个查询使用。为此,我创建了一个非常简单的类,它将连接池分配给一个成员变量。在构造函数中正确设置了成员变量,但当调用引用池成员变量的成员函数时,池为null。

注意:我有意扣留证件。请放心,这对我来说是正确的。:(

// Promise wrapper for MySQL driver
class Database {
constructor( connectionLimit = 10 ){
this.pool = mysql.createPool({
connectionLimit : connectionLimit,
host            : 'XXX',
user            : 'XXX',
password        : 'XXX',
database        : 'XXX'
});
console.log( this.pool ) // No problem!
}
query( sql, params ){
console.log( this.pool ) //UNDEFINED!!!!
// Irrelevant code removed
}
}

现在,如果我在模块级别而不是在类构造函数中定义池,那么一切都会按预期进行。

const pool = mysql.createPool({
connectionLimit : 10,
host            : 'XXX',
user            : 'XXX',
password        : "XXX",
database        : 'XXX'
});
// Promise wrapper for MySQL driver
class Database {
constructor( connectionLimit = 10 ){
console.log( this.pool ) // No problem!
}
query( sql, params ){
console.log( this.pool ) // No problem!

// Irrelevant code removed
}
}

在第一个示例中,无论调用哪个成员函数,我都希望this.pool引用在构造函数中创建的池。第二个例子正是我所期望的

此类正在一个快速API应用程序中使用。我正在创建Database的一个实例,然后将查询方法的引用分配给req对象。

const db = new Database();
app.use( ( req, res, next ) => {
req.query = db.query // Pretty sure I'm borking up the context here
});

进行时

req.query = db.query 

稍后使用req.query时,它可能看起来像:

req.query(parameters)

当内部代码调用callback时,它使用req的调用上下文来调用它,或者如果先放入独立变量中,则完全不使用调用上下文;它不被调用为对象CCD_ 5对象的属性。因此,当调用函数时,回调中的this不会引用特定的数据库实例。

在没有模块变量的情况下解决问题的另一种方法是传递回调,该回调本身使用正确的调用上下文调用.query

req.query = (...args) => db.query(...args);

最新更新