Formerly sequelize-singleton.
sequelize-connect is a simple singleton wrapper for the sequelize ORM, making it easier to configure and build models with Sequelize.
- Configuring sequelize-connect
- Custom Matcher
- Accessing Sequelize
- Defining Models
- Logging
- Contributing
NOTE: sequelize-connect
must be configured upon app initialization, prior to accessing your models
The sequelize-connect connect()
method accepts the same parameters as the Sequelize() object database, username, password, options
.
// app.js
var Connection = require('sequelize-connect');
var orm = new Connection(
'test-db',
'test-user',
'secret1234',
{
dialect: "mysql",
port: 3306
}
)
.then(function(instance){
// Connection is completed
});
It is important to configure the discover
array of the set of paths where your models should be discovered.
// app.js
var Connection = require('sequelize-connect');
var discover = [__dirname + '/models', ...];
var orm = new Connection(
'test-db',
'test-user',
'secret1234',
{
dialect: "mysql",
port: 3306
},
discover,
)
.then(function(instance){
// Connection is completed
});
Upon the first initialization of the Connection
e.g. new Connection(...);
sequelize-connect will ASYNCHRONOUSLY recurse through all of the subfolders located at the provided file paths looking for any files with the naming default convention *.model.js
. Connect will return a Promise that is called on it's completion.
You can use a connection string to connect as well:
new Connection(
'MyConnectionString',
{
dialect: "mysql",
port: 3306
})
.then(function(){
// Connection is completed
});
If you prefer to define your own naming convention instead of the default you can create a custom matching function which receives the file name as the parameter returns a boolean
indicating if sequelize-connect should attempt to load the file as a model.
This function should be injected to Connection
like so:
var matcher = function(file){
if(//some condition or regex here)
return true;
return false;
};
new Connection(
'test-db',
'test-user',
'secret1234',
{
dialect: "mysql",
port: 3306
},
discover,
matcher
)
After connecting you can access the sequelize instance and models wherever you need!
// somefile.js
var Connection = require('sequelize-connect');
var orm = new Connection(); // singleton pattern - returns the created instance
var sequelize = orm.sequelize;
var Sequelize = orm.Sequelize;
var models = orm.models;
var User = models.User;
If you prefer, rather than waiting for the connection to load before initializing every part of your application, you can wrap the code that has dependencies on your models in a then
. e.g.
// app.js
new Connection(
'MyConnectionString',
{
dialect: "mysql",
port: 3306
})
// foobar.js
var Promise = require('bluebird');
var Connection = require('sequelize-connect');
var orm = new Connection();
// This will ensure that the connection has been established
// if you load foobar.js before you wait for your initial connection
// to return
var Promise.resolve(orm)
.then(function(instance) {
var User = instance.models.Foo;
/**
* Get list of users
* restriction: 'admin'
*/
var index = function(req, res) {
Foo.bar()
};
})
Models are defined as per the suggestion the article here: http://sequelizejs.com/articles/express. All associations are done via the class method associate
which is injected with the models object.
// user.model.js
"use strict";
module.exports = function(sequelize, DataTypes) {
var User = sequelize.define("User", {
username: DataTypes.STRING
});
// class association method
User.associate = function(models) {
User.hasMany(models.Task);
}
return User;
};
Logging is optional, but is turned off by default. In order to enable logging, simply inject the logger of your choice:
myLogger = console;
// myLogger = winston;
// myLogger = ...;
new Connection(
'test-db',
'test-user',
'secret1234',
{
dialect: "mysql",
port: 3306
},
discover,
matcher,
myLogger
)
Your logger must comply with the following interface:
logger.log(level, message);
Please read the contributing guidlines