我觉得我对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;
那是布局。以下是问题:
答案 0 :(得分:1)
单独所需文件如何互动?书籍和作者控制器都需要访问mysql池,假定来自不同的用户。是实例化MySQL对象的新副本吗?
不,每次调用require
时都不会创建该对象的新副本。
在Node中,模块会根据需要加载,生成的导出对象缓存,以便后续调用require
,因此您将获得与getConnection
完全相同的引用每次拨打require('../config/mysql')
时。 module.exports = getConnection;
之前的行仅在第一次需要模块时运行。
池中的状态如何持续到下一个连接?
由于导出的getConnection
已缓存,因此该函数将始终引用相同的pool
对象,因此两个控制器都指向同一个池。