【问题标题】:Where should I define my MySQL client in a Node.js (Express) app?我应该在 Node.js (Express) 应用程序中的哪里定义我的 MySQL 客户端?
【发布时间】:2012-02-04 11:58:12
【问题描述】:

目前,我正在为node-mysql 设置我的客户端连接,方法是在我的app.js 和一个特殊的config/environment.js 中执行以下操作:

var client = mysql.createClient({
  user:     'USER',
  database: 'DATABASE',
  password: 'PASSWORD',
  host:     'HOST'
});

app.configure(function(){
  ...
  app.set('client', client);
  ...
});

然后在我的客户端代码中,我只需调用 app.settings.client 来使用 MySQL 客户端。

我不确定这是否是正确的方法,而且在我进行测试时它肯定不起作用,因为我需要一个正在运行的应用程序实例。

有什么建议吗?

【问题讨论】:

  • 使用app.set('client') 而不是app.settings.client。它应该适用于测试,您只需在单元测试中注入一个空的app 作为模拟的一部分
  • @Raynos 你如何注入一个空的app
  • 取决于您的代码。 I do something like this 但我认为您的架构完全不同。
  • @Raynos 我有一个open question,上面有关于如何处理 MySQL 模拟的赏金。如果你能刺伤,我会是一个快乐的人。
  • app.set(key, value); 设置值 app.set(key) 获取值。值存在于app.settings.client 中的事实是一个实现细节,可能会被更改。使用公开记录的 API 更安全

标签: mysql node.js express


【解决方案1】:

在我看来有 3 种解决方案:

a) 正如 @Raynos 在 cmets 中建议的那样,使用 app.set(key, value); 设置数据库值,然后 app.set(key) 获取该值。
b) 将您的路由包装到一个接受数据库作为参数的函数中。 示例:

sample_route.js

module.exports = function (db) {
  return function(req, res, next) {
    // db is accessible here
  }
}

app.js

var = sample_route = require('./sample_route')(db);
app.get('/sample', sample_route);


c) 创建一个可以在任何地方访问的全局变量(虽然不推荐):global.MY_DB = ...;

【讨论】:

    【解决方案2】:

    我认为更典型的方法是定义一个简单的中间件,将 mysql 客户端设置为请求的属性。例如:

    var client = mysql.createClient({
          user:     'USER',
          database: 'DATABASE',
          password: 'PASSWORD',
          host:     'HOST'
        })
    
    app.use(function(req, res, next) {
        req.mysql = client;
        next();
    });
    

    然后在您的路由处理程序中,您可以访问req.mysql。在您的测试用例中,您只需要以某种方式设置req.mysql,它应该很容易。

    【讨论】:

    • 这太可怕了。您为每个请求创建一个新的 mysql 对象 :(
    • @Raynos 是的,这就是我使用app.set()的原因。
    • 好吧,全局创建客户端,有req.mysql还是很方便的,而且似乎很适合传递req,res的Express架构。
    猜你喜欢
    • 2023-03-03
    • 2017-05-30
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多