如何在Node.js中使用单例设计模式和连接池来连接MySQL?

3
我正在使用node-mysql作为ORM(https://github.com/mysqljs/mysql)。
我正在使用MySQL和Node.JS创建REST API。之前我使用了MongoDB做同样的事情,而且它也很好用。(github.com/chanakaDe/Mint-REST)。现在我想使用MySQL来完成同样的任务。我已经完成了大部分工作,但还有一点问题。有很多类,我需要以单例设计模式的方式集中使用mysql连接。
这是我的新存储库:https://github.com/chanakaDe/MintRestSQL。我将展示我想使用这些模式的地方。这里我有数据库文件,并创建了一个新的连接池。(github.com/chanakaDe/MintRestSQL/blob/master/app/util/database.js)。
现在我想在我的控制器类中使用此连接/池。因为我不能在每个控制器类中创建一个连接,对吗?这是我现在的两个控制器。 (github.com/chanakaDe/MintRestSQL/blob/master/app/routes/report.js github.com/chanakaDe/MintRestSQL/blob/master/app/routes/api.js)
请告诉我更好的处理方式。我是node-mysql的新手,但这是在Node.JS环境中使用MySQL的绝佳方法,即使是用于生产级系统。因此,我想使用这些标准创建一个良好的API。是否有任何方法可以使用单例模式或类似的东西来集中连接并在所有控制器中使用它??
检查我的文件并理解代码需要一些时间。但请检查并给我提供解决方案。我尝试了很多方法,但没有成功:(
欢迎拉取repo并进行任何更新

我使用了像这样的链接 "github.com/chanakaDe/MintRestSQL/blob/master/app/routes/report.js",因为我现在不能使用超过2个链接。请看一下并试着给我一个解决方案。我真的被困在这里。 - Chanaka De Silva
2个回答

2
尝试将 database.js 更改为:
var mysql = require('mysql');

mysql.createPool({
  host     : 'localhost', 
  user     : 'root',
  password : 'chanaka',
  database : 'shared_adult'
}).connect();

module.exports = mysql;

1
为了给那些需要注入依赖项(如凭据)的人提供替代方案,以下方法可以生成一个运行时可配置的单例:
var mysql = require('mysql'),
    db;

module.exports = {
    init: function(conf){
        if(!db){
          db = mysql.createPool({
                host: conf.host, 
                user: conf.root,
                password: conf.password,
                database: conf.database
              });
        }
    },
    get: function() {
      if(!db) {
        throw new Error('The db pool has not been initialized, call init({}) prior to get().');
      }

      return db;    
    }
};

//initialize where you access your config (which should theoretically only be one place)
var mysqlDb = require('db'); //path to above db module

mysqlDb.init({
  host: 'host',
  user: 'user',
  password: 'password',
  database: 'database'
});

//use in your modules
var mysqlDb = require('db'), //path to above db module
    db = mysqlDb.get(); 

你能说明一下为什么在第一行的 require 语句中需要使用 db 吗? - Ali
1
它需要在全局范围内。 - pim
谢谢。我猜在使用单例模式时要考虑的一件事情是使得该db变量全局可访问。 - Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接