【问题标题】:NodeJS / Express - Make Available MySQL Connection Object in Router FileNodeJS / Express - 在路由器文件中提供 MySQL 连接对象
【发布时间】:2014-08-04 18:55:18
【问题描述】:

我的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.jsapp.js 文件中的connection 对象可用?

【问题讨论】:

标签: node.js express node-mysql


【解决方案1】:

我最终将数据库连接逻辑从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() 函数参数中的../

【讨论】:

  • 那将是另一种常见的方式。我喜欢传递它们,这样我就可以轻松地模拟它们进行测试。
  • @RobertMoskal 的答案 (stackoverflow.com/a/25125755/1489912) 更好,因为您可以将它用于连接池。这最终会让您无法控制所创建的连接。
  • @LloydBanks 在此示例中,是否在每个具有 var connection = require('../connection'); 的文件中实例化了一个新的数据库连接?那么,这是否意味着,如果我们将路由分成不同的文件,我们应该在路由处理程序使用连接完成后关闭连接?
【解决方案2】:

我的偏好是做一些简单的依赖注入,并通过将模块包装在一个函数中来将所需的资源传递给路由器:

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})); 

这样您就不必在添加依赖项时不断更改函数签名。这为您的 express 应用程序提供了超轻量级的控制反转。

【讨论】:

  • 这里的对象是怎么传过来的?
  • 只要将每个模块包装在一个函数中,就只是重复相同的模式。
【解决方案3】:

我遇到了同样的问题,Lloyds 的建议对我来说是一种解决方案,但我只是不想被困在单一类型的数据库上,我希望能够将我的应用程序移动到另一个数据库只是单个类的新实现。 所以这对我有用:

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

【讨论】:

    【解决方案4】:

    查看express-myconnection,它可以让您访问 MySQL 从您的路线中连接。

    更新:在生产中使用 express-myconnection 后,我不推荐它 - 它会泄漏连接,导致请求挂起(永远不会调用回调),并且不再主动维护。

    【讨论】:

      猜你喜欢
      • 2017-07-27
      • 2015-11-16
      • 1970-01-01
      • 2021-05-06
      • 2018-10-24
      • 1970-01-01
      • 2015-08-13
      • 2018-05-22
      • 2019-05-07
      相关资源
      最近更新 更多