javascriptnode.jsormexpressnode-orm2

node express with orm2 & separated model files


I am using node & express (framework for node). I wan't to use the node-orm2 framework for node for communicating with my MySQL database. To keep a nice structure I want to split up my models in separated files. I've been using the documentation on github but somehow I can't make it work.

app.js:

app.use(orm.express("mysql://********:********@localhost/*********",
{
    define: function(db, models){
        db.load('./models', function(err){
            models.movie = db.models.Movie;
        });
    }
}));

models.js:

module.exports = function (db, fn) {
    db.load("movie", function (err) {
        if (err) {
            return fn(err);
        }
    });
//etc
return fn();
};

movie.js:

module.exports = function (db, fn) {
    db.define('movie', {
        id          : { type: "number" },
        title       : { type: "text" },
        year        : { type: "number" },
        rating      : { type: "number" },
        description : { type: "text" }
    }, {
        methods : {

        }
    });

    return fn();
};

Solution

  • Copied help from github issue tracker (from lastmove):

    I am using the built in express middleware. It works fine for me. I have a folder Model. With one file par model. Example the user model: user.js

    module.exports = function(db, cb)
    {
        var User = db.define('user', {
                  userName : String,
                  password : String,
                  mail : String,
                  mark : Number,
                  lastAlertSent : Date,
                  subscriptionDate : Date,
                  lastAction : Date,
                  specialUser : Boolean,
                  uuid  : String
                  },
                  {
             validations:
                     {
                      userName : [orm.enforce.required(error.errorStr(error.missingRequiredField, "userName missing")), orm.enforce.unique({ ignoreCase: true },  error.errorStr(error.usernameAlreadyUsed, "userName already used")), orm.enforce.ranges.length(3, undefined, error.errorStr(error.usernameTooShort, "userName too shoty"))], 
    ...
    

    And in the Models folder i have an index.js In this file i define the relations betweens my models, and I load my models.

    File: models/index.js

    checkError = function(cb, err)
    {
        if (err)
            return cb(err);
        return cb();
    }
    
    module.exports = function(db, cb)
    {
        db.load("./user.js", function (err) {checkError(cb, err)});
        db.load("./alert.js", function (err) {checkError(cb, err)});
        db.load("./comment.js", function (err) {checkError(cb, err)});
        db.load("./metropole.js", function (err) {checkError(cb, err)});
        db.load("./period.js", function (err) {checkError(cb, err)});
        db.load("./stop.js", function (err) {checkError(cb, err)});
        db.load("./line.js", function (err) {checkError(cb, err)});
        db.load("./types.js", function (err) {checkError(cb, err)});
        db.load("./historique.js", function(err) {checkError(cb, err)});
    
        var User = db.models.user;
        var Alert = db.models.alert;
        var Comment = db.models.comment;
        var Metropole = db.models.metropole;
        var Stop = db.models.stop;
        var Line = db.models.line;
        var Period = db.models.period;
        var Types = db.models.types;
        var Hist = db.models.historique;
    
        Alert.hasOne("stop", Stop, {reverse : "alerts"});
        Alert.hasOne("line", Line, {reverse : "alerts"});
    

    and after all in my Express initialization i add this:

    app.use(orm.express(opts, {
        define: function (db, models, next) {
                db.load("./models/models", function (err2)
            {
                if (err2)   
                    throw err2;
                db.sync();
            })
            next();
        }