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

Popular posts from this blog

basic authentication with http post params android -

vb.net - Virtual Keyboard commands -

css - Firefox for ubuntu renders wrong colors -