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