Express - 将 mysql 连接传递给脚本

Express - Passing mysql connection to scripts

本文关键字:脚本 连接 mysql Express      更新时间:2023-09-26

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

我使用的一种模式是在模块中设置我的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对象。由于require是缓存的,因此这实际上不会多次调用设置方法。

在应用中.js:

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

在模型/用户.js中:

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

最后一个选项(不建议使用)是污染全局命名空间。这似乎是你真正想要的答案:

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

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

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

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

您可以将 mysql 连接注入其他脚本,如下所示:

应用.js

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

主.js

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

更新:

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

应用.js

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

新闻.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;
};