Я чувствую, что мне не хватает базового понимания того, как архитектура 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;
Это макет. Вот вопросы:
Как взаимодействуют отдельные файлы? Контроллеры книг и авторов должны требовать и получать доступ к пулу mysql, предположительно от разных пользователей. Создана ли новая копия объекта MySQL?
Нет, новая копия объекта не будет создана при каждом require
.
В узле модули загружаются по мере необходимости, и полученный объект экспорта кэшируется для последующих вызовов, require
, поэтому вы получите точную ссылку на getConnection
каждый раз, когда вы require('../config/mysql')
. Строки перед module.exports = getConnection;
запускается только в первый раз, когда требуется модуль.
Как состояние из пула сохраняется до следующего соединения?
Поскольку экспортированный getConnection
кэшируется, эта функция всегда будет ссылаться на один и тот же объект pool
, поэтому оба ваших контроллера ссылаются на один и тот же пул.