【问题标题】:Express - Passing mysql connection to scriptsExpress - 将 mysql 连接传递给脚本
【发布时间】:2012-08-07 11:21:54
【问题描述】:

我用app.js所需的所有参数定义了mysql连接,默认情况下如何使routes/中的其他脚本可见,而不需要或重新定义mysql参数, 只使用client.query(..)?

【问题讨论】:

  • @EdJr 不管什么......你有没有看过问题之间的日期差异? 2012 年 8 月 7 日和 2013 年 5 月 28 日……你看到区别了吗?
  • 我标记这个问题是有充分理由的。 This 很好地总结了推理,并且它具有(有用的)重复本身的链接这一事实是另一个很好的说明。

标签: javascript node.js express


【解决方案1】:

我使用的一种模式是在一个模块中设置我的db 对象一次并导出它:(我们称之为utils/mySQL.js

//I haven't used real mysql in node so excuse the pseudo-syntax:
var db = require('mysql-driver-thingy');
db.connect('localhost', 'sqlport', options...);
db.otherSetupFunctions();
console.log("Finished db setup. You should only see this message once! Cool.");

module.exports = db;

然后我可以在任何需要它的地方请求db 对象。由于requires 被缓存,这实际上并没有多次调用 setup 方法。

在 app.js 中:

var db = require('./utils/mySQL.js');
...

在模型/user.js 中:

var db = require('../utils/mySQL.js');
...

最后一个不推荐的选项是污染全局命名空间。这似乎是您真正想要的答案:

//set up your db
...
// and now make it available everywhere:
global.client = db.client

您现在可以在所有模块中神奇地使用客户端对象,甚至不需要它。

不过,全局变量不好的原因有很多:

  • 如果您的代码和其他代码定义了全局变量,它们可能会发生冲突并相互覆盖。
  • 很难找到您定义db/client 对象等的位置。

【讨论】:

  • 这种方法意味着您不必像@Vadim 的回答那样将mysqlConnection 传递到每个模块中。
  • 再次你需要在user.js mysql 连接,而另一个答案,通过要求一次,你可以做类似module.exports.list=function(req,res,mysql) .. 我想..
【解决方案2】:

您可以像这样将 mysql 连接注入其他脚本:

app.js

var mysqlConnection = new Conection(params);
require('controller/main.js)(mysqlConnection);

main.js

module.exports = function(mysqlConnection) {
    // You can access your mysql connection here
};

更新:

您可以以相同的方式注入多个变量。如果需要,您仍然可以从模块中导出方法:

app.js

var mysqlConnection = new Conection(params);
var news = require('model/news.js)(app, mysqlConnection);
news.list(function(err, news) {
    // Do something
});

news.js

module.exports = function(app, mysqlConnection) {
    var methods = {};
    // mysql connection and app available from here
    methods.list = function(cb) {
        mysqlConnection.list(function(err, data) {
            cb(err, data);
        });
    };

    return methods;
};

【讨论】:

  • 你在哪里有mysqlConnection 使用require,我传递了app 变量,我可以在那里传递其他变量吗?像require('..')(variable,variable) 没有找到太多关于此的文档
猜你喜欢
  • 2011-03-15
  • 2010-09-09
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 2016-05-03
  • 1970-01-01
  • 2014-08-22
相关资源
最近更新 更多