node.js - Clean method for declaring models -
i have node project uses express, orm , sqlite3.
i have multiple models. each model declared similar this:
var orm = require('orm'); var db = orm.connect({database: ':memory:', protocol: 'sqlite'}); var schema = db.define('service', { uptime: number, // ... }); db.sync(function (err) { !err && console.log("db synced!"); }); module.exports = schema; no particularly pleasant across dozen models repeatedly require , connect.
i tidy can connect in app.js , load in models , use them in routes. can't working. doing:
first define connect , define models in app.js:
var service; orm.connect(app.get('db-opt'), function(err,db){ !err && console.log("db connected!"); if (err){ throw err; } db.load('./models', function(err){ app.service = service = db.models.service; !err && console.log("models loaded!"); }); db.sync(function(err){ !err && console.log("db synced!"); }); }); the models/index.js file looks like:
module.exports = function(db,fn){ db.define('service', { uptime: number, // ... }); return fn(); }; and routes/services.js looks like:
var services = []; exports.list = function(service){ return function(req, res){ service.find({}, function(err, services){ if (err){ return next(err); } res.render('services', { title: 'services', services: services }); }); }; }; and connect route in app.js:
app.get('/services', services.list(service)); i expected console messages try visit following error: typeerror: cannot call method 'find' of undefined.
i have tried passing app.service , models.service service.list neither works giving same error.
how can cleanly load models , have them accessible routes require them?
update: can prove db.load call working following code:
db.load('./models', function(err){ var services = []; service = db.models.service; service.find({}, function(err, services) { if (err){ throw err; } }); !err && console.log("models loaded!"); }); as gives error: sqlite_error: no such table: service
it appears close. under assumption app.get('/', services.list(service)); called whatever value in service when invoked. despite app.get(...) being executed (possibly) before callback of orm.connect resolved correctly after http.createserver(app). not so.
moving app.get(..) within orm.connect call causes work.
thus:
// define models var db = orm.connect(app.get('db-opt'), function(err,db){ !err && console.log("db connected!"); if (err){ throw err; } db.load('./models', function(err){ app.service = db.models.service; !err && console.log("models loaded!"); }); db.sync(function(err){ !err && console.log("db synced!"); }); app.get('/', services.list(app.service)); // ... }); while method use, can see different way?
Comments
Post a Comment