如何使用CoffeeScript设置Sequelize单例?

时间:2015-01-17 20:06:29

标签: node.js coffeescript npm sequelize.js

我正在创建一个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'

如何设置我的包来完成此任务?

1 个答案:

答案 0 :(得分:1)

Node.js中没有必要使用Singleton模式来完成你想要做的事情,尽管如果你愿意,你仍然可以使用它。 Node.js缓存所有require()调用,因此每次调用require('。/ mydb')时,它都将返回完全相同的对象或函数。

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

module.exports = new MyDb({.. connection info ..})

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

因此,通常的做法是使用Sequelize简单地创建一个调用新Sequelize()并导出该实例的文件(以及模型,就像你已经完成的那样)。