Node.js — модули инициализируются только один раз?

#javascript #node.js #commonjs

#javascript #node.js #commonjs

Вопрос:

Я использую драйвер node-mysql для node.js приложение. Вместо того, чтобы снова и снова настраивать соединение с mysql для каждого из моих модельных модулей, я делаю это:

 // DB.js
var Client = require('mysql').Client;
var DB_NAME = 'test_db';
var client = new Client();
client.user = 'user';
client.password = 'pass';
client.connect();
client.query('USE ' DB_NAME);
module.exports = client;

// in User.js
var db = require("./DB");
// and make calls like:
db.query(query, callback);
  

Теперь я замечаю, что DB.js инициализируется подключением к БД только один раз. Итак, впоследствии используется один и тот же client объект… Как мне структурировать DB.js таким образом, когда я требую этого от модели, каждый раз будет устанавливаться новое подключение к БД? Я знаю, что это как-то связано с использованием new , но я не могу обмозговать это.

Ответ №1:

 module.exports = function() {
    var client = new Client();
    client.user = 'user';
    client.password = 'pass';
    client.connect();
    client.query('USE ' DB_NAME);
    return client;
}

var db = require("./DB")()
  

Инициализируйте нового клиента каждый раз, когда вы вызываете базу данных.

Вы могли бы использовать Object.defineProperty для определения exports пользовательской логики получения, чтобы вы могли делать var db = require("./DB") , если хотите.

Комментарии:

1. В конце функции должно быть return client; . В противном случае db.query() не будет работать.

2. @jeffreyveon не могу поверить, что никто не заметил такую очевидную ошибку. Спасибо.