【问题标题】:How can I set up a Sequelize singleton with CoffeeScript?如何使用 CoffeeScript 设置 Sequelize 单例?
【发布时间】:2015-03-16 05:27:25
【问题描述】:

我正在创建一个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 coffeescript npm sequelize.js


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 那我如何拥有connection info 部分呢?
    • 在你的 costructor 中,你期待一个对象配置。所以我假设你会按照以下方式做一些事情:new MyDB({ host: localhost, port: database: 'mydb' , etc }) 和任何其他所需的凭据。
    • 对,但如果在 module.exports 中,那么我如何从我的调用文件中传递它?
    • 在这种情况下,您将无法做到。所以你想导出类,但在另一个文件中实例化?您能展示一下您希望该文件是什么样子吗?
    • 如果您查看我原始帖子中的第二个 sn-p,就会知道该文件应该是什么样子。
    猜你喜欢
    • 2011-11-12
    • 2014-03-02
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2021-07-16
    • 2016-04-30
    • 2016-04-15
    相关资源
    最近更新 更多