gpt4 book ai didi

mysql - Node 的 require() 如何解析,以便 Express 中的持久数据库池发挥作用?

转载 作者:行者123 更新时间:2023-11-29 10:28:58 26 4
gpt4 key购买 nike

我觉得我对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. 需要相同依赖项的单独文件如何交互? Books 和 Author Controller 都需要请求并访问 mysql 池,假设来自不同的用户。 MySQL 对象的新副本是否已实例化?
  2. 池中的状态如何保留到下一个连接?

最佳答案

How do separately required files interact? Books and Author controllers both need to require and access the mysql pool, assumedly from different users. Is a new copy of the MySQL object instantiated?

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

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

How does the state from the pool persist to the next connection?

由于导出的 getConnection 已缓存,因此该函数将始终引用同一个 pool 对象,因此两个 Controller 都引用同一个池。

关于mysql - Node 的 require() 如何解析,以便 Express 中的持久数据库池发挥作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47786754/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com