如何使用 CoffeeScript 设置 Sequelize 单例?

How can I set up a Sequelize singleton with CoffeeScript?

我正在创建一个 npm 程序包,它将充当连接到我的数据库的单例。它最终将处理其他实用程序类型的函数并内置复杂的查询。我想使用 Sequelize 连接到我的数据库。

在我的包裹里,我有:

class Singleton
  @getInstance: ->
    @_instance ?= new @(arguments...)

class MyDb extends Singleton
  constructor: (config) ->
    sequelize = new Sequelize config.database, config.username, config.password,
      dialect: 'postgresql'
      host: config.host
      port: config.port
      logging: false
      define:
        charset: 'utf8'
        collate: 'utf8_general_ci'

    db = {}

    modelPath = "./models"

    files = fs.readdirSync modelPath

    _.each files, (file) ->
      if '.coffee' is path.extname file
        model = sequelize.import path.join modelPath, file
        db[model.name] = model

    Object.keys(db).forEach (modelName) ->
      if 'associate' of db[modelName]
        db[modelName].associate db

    myDb = _.assign db, 
      sequelize: sequelize
      Sequelize: Sequelize

    console.log myDb
    return myDb

module.exports = MyDb

我显然做错了很多。最后,我想这样使用它:

mydb = require 'mydb'

mydb.connect 'myconnection params', (err) ->
  console.log err if err

# some code and stuff here

mydb.User.find
  where:
    email: 'bob
.complete (err, dbUser) ->
  #whatever

# SOME OTHER FILE THAT GETS CALLED AFTER THE MAIN ONE
mydb = require 'mydb'

mydb.Home.find
  where:
    zip: '12345'

如何设置我的程序包来完成此操作?

在 Node.js 中不需要单例模式来完成您想要做的事情,但如果您愿意,您仍然可以使用它。 Node.js 缓存所有 require() 调用,因此每次调用 require('./mydb') 时它都会 return 完全相同的对象或函数。

要使您的代码正常工作,您只需要:

module.exports = new MyDb({ .. 连接信息 .. })

从那时起,在你的各种文件中,你可以调用 require('./mydb'),它将 return 你的 MyDB class 的相同实例(它不会执行new MyDb() 每次你调用require,这是一个常见的错误!)。

因此,在使用 Sequelize 时,通常的做法是简单地创建一个调用 new Sequelize() 的文件并导出该实例(连同模型,就像您所做的一样)。