NodeJS / Express – 在路由器文件中创build可用的MySQL连接对象
我有我的app.js
文件中的以下内容:
var mysql = require('mysql'); var connection = mysql.createConnection({ host: 'localhost', port: 3306, user: 'user', password: 'password', database: 'mydatabase' }); connection.connect();
在routes/index.js
,我目前只有样板代码:
var express = require('express'); var router = express.Router(); module.exports = router;
如何使routes/index.js
的app.js
文件中的connection
对象可用?
我结束了从app.js
文件拆分数据库连接逻辑。 在一个名为connection.js
的单独文件中,我有以下内容:
var mysql = require('mysql'); var connection = mysql.createConnection({ host: 'localhost', port: 3306, user: 'user', password: 'password', database: 'mydatabase' }); module.exports = connection;
然后在我的路由文件中,我添加
var connection = require('../connection');
到我所有其他模块被引入的文件顶部。在我的例子中, connection.js
文件比我的路由文件高一级,因此require()
函数参数中的../
。
我的首选是做一些简单的dependency injection,并通过包装模块在一个函数中传递所需的资源到路由器:
var express = require('express'); module.exports = function (connection) { var router = express.Router(); //do stuff with the connection return router; }
然后,您只需将app.js中的路由器模块实例化为数据库连接的参数:
app.use('/where/ever', require('./module-b')(connection));
通常我把依赖包装在一个对象中:
app.use('/where/ever', require('./module-b')({db:connection}));
这样你就不必随着依赖关系的添加而改变函数签名。 这为您的快速应用程序提供了超轻量级的控制反转。
我有同样的问题,劳埃德的build议是一种解决scheme对我来说,但我只是不想被困在单一types的数据库,我想能够将我的应用程序移动到另一个数据库只有一个新的实现一个单一的类。 所以那为我工作:
function DataAccess(connectionData) { //Using the connectionData... } var _dataAccessInstance; module.exports = function (connectionData) { if (!_dataAccessInstance) { _dataAccessInstance = new DataAccess(connectionData) } return _dataAccessInstance; };
然后用法将只需要文件:
//The object is the connection data to be sent to the module var dataAccess = require('./data-access')({});
当然,这有其自身的缺陷,就像每个模块必须知道并发送连接数据一样。 但我假设数据存储在configuration中,所有的模块都可以访问它。
看看express-myconnection ,它可以让你从你的路由中访问MySQL连接。
更新:在生产中使用express-myconnection后,我不会推荐它 – 它会泄漏连接,导致请求挂起(callback永远不会被调用),并且不再被主动维护。