I'm beginning learning Node.js and Backbone. I'd like to share some code between the server and the client (related to [1] and [2]). More in deep:
- Share defaults values for a model. Defaults are used to populate forms (client-side), while they are enforced server-side
- Share validation rules in order to be DRY and perform client/server validation
- Share instance methods
So my idea is to use a factory
object to encapsulate common code (defaults, validation rules, public instance methods) and adapt the factory
object based on the environment (Node.js or AMD module).
This code is quick&dirty and may not work. Is this a good approach or just a waste of time?
(function (factory) {
if (typeof exports === 'object') { // Node.js
var config = require('../config/config.json'),
Sequelize = require('sequelize'),
_ = require('underscore');
var User = {
receiveSms: {
type: Sequelize.BOOLEAN, allowNull: false
},
receiveNewsletter: {
type: Sequelize.BOOLEAN, allowNull: false
}
};
// Add defaultValue for each returned by
_.each(factory.defaults, function (value, key) {
if(_.has(User, key)) {
User[key].defaultValue = value;
}
});
module.exports = function () {
(new Sequelize(config.database, config.username, config.password))
.define('User', User);
};
} else if (typeof define === 'function' && define.amd) { // AMD
define(['backbone', 'uderscore'], function (Backbone, _) {
return Backbone.Model.extend(factory);
});
}
}(function () {
return { // To be adapted
defaults: {
receiveSms: false,
receiveNewsletter: true
}
}
}));