I'm testing node-orm and I can't find the correct way to export models. Here is the model definition (./models/user.js):
var orm = require('orm');
var db = orm.connect('pg://user@localhost/accounts', function(success, db) {
if (!success) {
console.log('Could not connect to database.');
return;
}
var User = db.define('user', {
... // Model schema
});
module.exports = User;
});
And when I try to use it elsewhere (e.g. ./app.js):
var User = require('./models/user');
...
app.get('/test', function(req, res) {
var user = new User({
...
});
user.save(function(err, user) {
...
});
...
});
Turns out that User is an empty object so node can't call the model constructor. What is the proper way to export a model with node-orm ? That's probably simple but I find anything in the docs…
Your problem is that you're setting your module.exports
in a callback function. Node's module loading system specifically states that you cannot do that.
The orm-node
module stores your models in its module exports with the name that you specify for your model. Your example should work if you change your app.js
to read:
require('./models/user');
var orm = require('orm');
...
app.get('/test', function(req, res) {
var user = new orm.user({
...
});
user.save(function(err, user) {
...
});
...
});
Also note that because your model is initialized in a callback it is not immediately available after you require()
your model module. Presumably you'll have completed your database connection and model initialization before you need to process a get of /user
.
Probably the safest way to handle all this would be to make sure your application initialization and listen()
are done as a part of that orm.connect()
callback.
It is how I do it with light-orm:
var ORM = require('light-orm');
var AdsCollection = new ORM.Collection({
connector: ORM.driver,
tableName: 'ads'
});
module.exports = AdsCollection;
Should be pretty similar with your ORM. I have migrated from node-orm to light-orm because of magic issues and complexity. You may look at light-orm also: https://npmjs.org/package/light-orm