我正在创建一个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'
如何设置我的包来完成此任务?
答案 0 :(得分:1)
Node.js中没有必要使用Singleton模式来完成你想要做的事情,尽管如果你愿意,你仍然可以使用它。 Node.js缓存所有require()调用,因此每次调用require('。/ mydb')时,它都将返回完全相同的对象或函数。
要使您的代码正常工作,您只需要:
module.exports = new MyDb({.. connection info ..})
从那时起,在你的各种文件中,你可以调用require('。/ mydb'),它将返回你的MyDB类的相同实例(每次调用require时它都不会执行新的MyDb(),这是一个常见的错误!)。
因此,通常的做法是使用Sequelize简单地创建一个调用新Sequelize()并导出该实例的文件(以及模型,就像你已经完成的那样)。