NodeJS / Express - 在路由器文件中提供可用的MySQL连接对象

时间:2014-08-04 18:55:18

标签: node.js express node-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;

如何在connection的{​​{1}}文件中提供app.js对象?

4 个答案:

答案 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模块都可以访问它。