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