Abstract layer for database

I have been looking around for simple database abstraction implementation, then i found great article http://howtonode.org/express-mongodb, which old but I still like the idea.

Well maybe the construction, could take some kind of object literal with database settings. So the main idea is that there could be different implementations of UserService-s, but locate in different directories and require only the one that's needed.

/data-layer/mongodb/user-service.js
                   /post-service.js
                   /comment-service.js

/data-layer/couchdb/user-service.js
                   /post-service.js
                   /comment-service.js

When the Database is needed, I wil get it with var UserService = require(__dirname + '/data-layer/mongodb/user-service).UserService(db); where var db = "open db object"

Would this be the correct way to do it or is there any better solutions ?

There are a few, avaible via NPM :

  • Node-DBI : "Node-DBI is a SQL database abstraction layer library, strongly inspired by the PHP Zend Framework Zend_Db API. It provides unified functions to work with multiple database engines, through Adapters classes. At this time, supported engines are mysql, mysql-libmysqlclient and sqlite3". Looks like the developpment has been paused.
  • Accessor : "A database wrapper, provide easy access to databases." Supports only MySQL and MongoDB at the moment.
  • Activerecoard : "An ORM written in Coffeescript that supports multiple database systems (SQL, NoSQL, and even REST), as well as ID generation middleware. It is fully extendable to add new database systems and plugins."

I though it might be time to update the answer of an old question:

If you want to use MongoDB as your document-oriented database, mongoose is a good choice and easy to use (example from official site):

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

var Cat = mongoose.model('Cat', { name: String });

var kitty = new Cat({ name: 'Zildjian' });
kitty.save(function (err) {
  if (err) // ...
  console.log('meow');
});

For a rather modern approach, Mongorito is a good ODM which uses ES6 generators instead of callbacks.

As of 06.2015 I reckon that the best ORM for SQL databases with Node.js/io.js is Sequelize supporting the following databases:

  • PostgreSQL
  • MySQL
  • MariaDB
  • SQLite
  • MSSQL

The setup is fairly easy:

var sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: 'mysql'
});

// Or you can simply use a connection uri
var sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname');

It also provides transactions, migrations and many other goodies.