#mysql #node.js #ecmascript-6
#mysql #node.js #ecmascript-6
Вопрос:
Я хотел бы создать один пул соединений, который будет использоваться каждым запросом. Для этого я создал очень простой класс, который присваивает пул соединений переменной-члену. Переменная-член правильно установлена в конструкторе, но когда вызывается функция-член, которая ссылается на переменную-член пула, pool имеет значение 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
ссылаться на пул, созданный в конструкторе, независимо от того, какая функция-член вызывается. Второй пример делает именно то, что я ожидал от него.
Этот класс используется в приложении express API. Я создаю экземпляр базы данных, а затем присваиваю объекту req ссылку на метод запроса.
const db = new Database();
app.use( ( req, res, next ) => {
req.query = db.query // Pretty sure I'm borking up the context here
});
Комментарии:
1. Можете ли вы показать, как вы используете
.query
, в другом модуле?2. @CertainPerformance При ближайшем рассмотрении я уверен, что вы нашли мою проблему. Я увеличиваю контекст, когда назначаю ссылку на метод запроса объекту req.
Ответ №1:
Когда вы делаете
req.query = db.query
Когда req.query
он будет использован позже, это, вероятно, будет выглядеть примерно так:
req.query(parameters)
При вызове внутреннего кода callback
он вызывает его с вызывающим контекстом req
или вообще без вызывающего контекста, если сначала поместить его в отдельную переменную; он не вызывается как свойство объекта db
object . Поэтому, когда вызывается функция, this
внутренний обратный вызов не ссылается на конкретный экземпляр базы данных.
Другим способом решения вашей проблемы без переменной модуля было бы передать обратный вызов, который сам вызывается .query
с соответствующим контекстом вызова:
req.query = (...args) => db.query(...args);