Express set()方法存储引用还是值?附mysql2连接池实例疑问
app.set() 的工作机制:存储引用还是实际值? 嘿,这个问题问得特别实用!我来帮你把这个点理清楚。
核心结论先给你:app.set('name', value) 存储的是你传入值的引用(如果是对象、函数这类引用类型的话),而非值的拷贝;如果是字符串、数字这类原始类型,存的就是实际值。放到你的mysql2连接池场景里,答案很明确:
你的 mysql2.js 里,module.exports = mysql2.createPool(...) 这行代码,createPool() 执行后返回的是一个已经初始化完成的连接池实例对象,不是 createPool 函数本身。当你在Express应用中写 app.set('mysql2', require('./mysql2')) 时,require('./mysql2') 会直接加载这个已经创建好的连接池对象,app.set() 只是把这个对象的引用存在了Express应用的设置集合里。
为什么是这样?其实Express内部维护了一个叫 app.settings 的键值对对象,app.set() 本质就是往这个对象里添加属性。对于引用类型的值,它只会保存这个值在内存中的地址,所以后续你用 app.get('mysql2') 拿到的,和直接 require('./mysql2') 拿到的是同一个连接池实例——整个应用里共享这一个实例,不会重复创建连接池,这也是Node.js里共享资源的常规正确做法。
你可以做个简单测试验证:
// 在你的Express应用中 const pool = require('./mysql2'); app.set('mysql2', pool); console.log(pool === app.get('mysql2')); // 会输出true,说明二者是同一个对象引用
所以最后再明确回答你的疑问:存储的不是 mysql2.createPool 函数的引用,而是已经创建好的连接池实例的引用,整个应用中通过 app.get('mysql2') 调用的都是同一个实例。
内容的提问来源于stack exchange,提问作者Jujubes

