我的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;
如何在connection
的{{1}}文件中提供app.js
对象?
答案 0 :(得分:13)
我最终从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
文件比我的路由文件高一级,因此../
在{{1}函数参数。
答案 1 :(得分:8)
我的偏好是做一些简单的依赖注入,并通过将模块包装在一个函数中将所需的资源传递到路由器中:
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}));
这样,您就不必在添加依赖项时不断更改函数签名。这为您的快速应用程序提供了超轻量级的控制反转。
答案 2 :(得分:0)
查看express-myconnection,它可以让您访问MySQL 从你的路线内连接。
更新:在生产中使用express-myconnection后,我不推荐它 - 它会泄漏连接,导致请求挂起(永远不会调用回调),并且不再主动维护它。
答案 3 :(得分:0)
我有同样的问题,劳埃德'建议对我来说是一种解决方案,但我只是不想被困在单一类型的数据库上,我希望能够将我的应用程序移动到另一个数据库,只需要一个单独的类的新实现。 这对我有用:
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')({});
当然,这有其自身的缺陷,就像每个模块必须知道并发送连接数据一样。但我假设数据存储在配置中,所有的hte模块都可以访问它。