在Node.js(Express)应用程序中,我应该在哪里定义MySQL客户端?

在Node.js(Express)应用程序中,我应该在哪里定义MySQL客户端?,mysql,node.js,express,Mysql,Node.js,Express,目前,我正在通过在我的app.js和一个特殊的config/environment.js中执行以下操作,为节点mysql设置客户端连接: var client = mysql.createClient({ user: 'USER', database: 'DATABASE', password: 'PASSWORD', host: 'HOST' }); app.configure(function(){ ... app.set('client', cli

目前,我正在通过在我的
app.js
和一个特殊的
config/environment.js
中执行以下操作,为
节点mysql
设置客户端连接:

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

app.configure(function(){
  ...
  app.set('client', client);
  ...
});
然后在我的客户机代码中,我只调用
app.settings.client
来使用MySQL客户端

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


有什么建议吗?

我认为更典型的方法是定义一个简单的中间件,将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
,这应该非常简单。

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

a) 按照@Raynos在评论中的建议,使用
app.set(键,值)
设置db值,然后app.set(key)获取该值
b) 将路由包装到接受数据库作为参数的函数中。 例如:

示例_route.js

module.exports = function (db) {
  return function(req, res, next) {
    // db is accessible here
  }
}
var = sample_route = require('./sample_route')(db);
app.get('/sample', sample_route);
app.js

module.exports = function (db) {
  return function(req, res, next) {
    // db is accessible here
  }
}
var = sample_route = require('./sample_route')(db);
app.get('/sample', sample_route);


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

使用
app.set('client')
而不是
app.settings.client
。它应该与测试一起工作,您只需要将一个空的
应用程序
作为测试的一部分注入到您的单元测试中mocking@Raynos如何注入空的
应用程序
?取决于您的代码。“但我认为你们的架构是完全不同的。”Raynos我对如何处理MySQL模拟有一个很好的了解。如果你能尝试一下,我会是一个快乐的人。
app.set(key,value)设置值
app.set(key)
获取值。该值存在于
app.settings.client
中这一事实是一个实现细节,可能会被更改。使用公共文件记录的APIs更安全,这很可怕。您为每个请求创建一个新的mysql对象集:(@Raynos是的,这就是为什么我使用
app.set()
。好吧,全局创建客户机,使用req.mysql仍然很方便,而且似乎很适合传递req、res的快速体系结构。