繁体   English   中英

Node的require()如何解决,以便Express中的持久数据库池起作用?

[英]How does Node's require() resolve, such that persisted database pooling in Express works?

我觉得我对如何将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. 池中的状态如何持续到下一个连接?

单独需要的文件如何交互? 书籍和作者控制器都需要(假设来自不同用户)需要并访问mysql池。 是否实例化了MySQL对象的新副本?

不,不会在每次调用require创建该对象的新副本。

在Node中,将根据需要加载模块,并将生成的导出对象缓存起来,以供随后的require调用,因此,每次调用require('../config/mysql') ,您都会获得与getConnection完全相同的引用。 module.exports = getConnection;之前的行module.exports = getConnection; 在第一次需要该模块时运行。

池中的状态如何持续到下一个连接?

因为导出的getConnection被缓存,所以该函数将始终引用相同的pool对象,因此两个控制器都引用相同的池。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM