如何使用 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() 的文件并导出该实例(连同模型,就像您所做的一样)。
我正在创建一个 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() 的文件并导出该实例(连同模型,就像您所做的一样)。