Как Node's require () разрешает, так что постоянное объединение баз данных в Express работает?

0

Я чувствую, что мне не хватает базового понимания того, как архитектура nodejs объединяется, так что приведенный ниже код без проблем. Я собираюсь выложить простое приложение. Можете ли вы, ребята, помочь мне с вопросами в конце?

Примечания: Я использую пакет mysql https://github.com/mysqljs/mysql

node app.js запускается из командной строки.

Внутри app.js есть следующее:

const Express = require("express");
const Path = require("path");

const app = Express();  

// Require controller modules
var book_controller = require('../controllers/bookController');
var author_controller = require('../controllers/authorController');

router.get('/book', book_controller.books_get);
router.get('/author', book_controller.authors_get);

app.listen(5000, function(){
    console.log("Server started on port 5000");
});

Внутри bookController:

var getConnection = require('../config/mysql');

// Display list of all books
exports.book_get = function(req, res) {
    getConnection(function(err, con) {
        query = 'SELECT * FROM books';
        con.query(query, function(err, result) {
            if (err) throw err;
            con.release();
            res.render('page/authors', { result:result});
        });
    })        
};

Внутри authorController:

var getConnection = require('../config/mysql');

// Display list of all books
exports.authors_get = function(req, res) {       
    getConnection(function(err, con) {
        query = 'SELECT * FROM authors';
        con.query(query, function(err, result) {
            if (err) throw err;
            con.release();
            res.render('page/books', { result:result});
        });
    })      
};

Внутри mysql.js

var mysql = require('mysql');    
var pool = mysql.createPool({
    connectionLimit: 100,
    connectTimeout: 5000,
    acquireTimeout: 5000,
    queueLimit: 30,
    host: 'localhost',
    user: '',
    password: '',
    database: '',
    multipleStatements: true,
});    

var getConnection = function(callback) {
    pool.getConnection(function(err, connection) {
        if (err) return callback(err);
        callback(err, connection);
    });
};

pool.on('acquire', function(connection) {
    console.log('Connection %d acquired', connection.threadId);
});
module.exports = getConnection;

Это макет. Вот вопросы:

  1. Как взаимодействуют отдельные файлы, требующие одинаковой зависимости? Контроллеры книг и авторов должны требовать и получать доступ к пулу mysql, предположительно от разных пользователей. Создана ли новая копия объекта MySQL?
  2. Как состояние из пула сохраняется до следующего соединения?
Теги:
express

1 ответ

1
Лучший ответ

Как взаимодействуют отдельные файлы? Контроллеры книг и авторов должны требовать и получать доступ к пулу mysql, предположительно от разных пользователей. Создана ли новая копия объекта MySQL?

Нет, новая копия объекта не будет создана при каждом require.

В узле модули загружаются по мере необходимости, и полученный объект экспорта кэшируется для последующих вызовов, require, поэтому вы получите точную ссылку на getConnection каждый раз, когда вы require('../config/mysql'). Строки перед module.exports = getConnection; запускается только в первый раз, когда требуется модуль.

Как состояние из пула сохраняется до следующего соединения?

Поскольку экспортированный getConnection кэшируется, эта функция всегда будет ссылаться на один и тот же объект pool, поэтому оба ваших контроллера ссылаются на один и тот же пул.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню