0

I'm creating a node application that makes use of two Databases. I am trying to implement the mongoose.createConnection() method. I can see how it could apply in a project that is not strictly modularized but when modularized this method is not calling correctly.

For example the below code makes use of the createConnection method pretty well if I kept all the logic in one file:

var conn      = mongoose.createConnection('mongodb://localhost/testA');
var conn2     = mongoose.createConnection('mongodb://localhost/testB');

// stored in 'testA' database
var ModelA    = conn.model('Model', new mongoose.Schema({
title : { type : String, default : 'model in testA database' }
}));

// stored in 'testB' database
var ModelB    = conn2.model('Model', new mongoose.Schema({
title : { type : String, default : 'model in testB database' }
}));

Due to strict modularization practices my files are set up like this:

mongoose.js

var mongoose = require('mongoose');
var fs = require('fs');

// connect to the database
var conn = mongoose.createConnection('mongodb://localhost/testA');
var conn2 = mongoose.createConnection('mongodb://localhost/testB');

// traditional way of making a single Mongo connection
// mongoose.connect('mongodb://localhost/surgeon_solutions');

// specify the path to all of the models
var models_path = __dirname + '/../models'

// read all of the files in the models_path and for each one check if it is a javascript file before requiring it
fs.readdirSync(models_path).forEach(function(file) {
    if(file.indexOf('.js') > 0) {
    require(models_path + '/' + file);
    }
})

user_model.js

I have tried replacing 'mongoose.model('User', UserSchema);' with 'conn.model('User', UserSchema);' but this still does not work.

var mongoose = require('mongoose');
var crypto = require('crypto');
var jwt = require('jsonwebtoken');
var secret = "secret"

var UserSchema = new mongoose.Schema({
    username: {type: String, lowercase: true, unique: true},
    email: {type: String, lowercase: true, unique: true},
    hash: String,
    salt: String
});

UserSchema.methods.setPassword = function(password){
    this.salt = crypto.randomBytes(16).toString('hex');

    this.hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
};

UserSchema.methods.validPassword = function(password) {
    var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');

    return this.hash === hash;
};

UserSchema.methods.generateJWT = function() {
    var today = new Date();
    var exp = new Date(today);
    exp.setDate(today.getDate() + 1);

return jwt.sign({
    _id: this._id,
    username: this.username,
    exp: parseInt(exp.getTime() / 1000),
}, secret);
};

mongoose.model('User', UserSchema);

user_controller.js

var crypto = require('crypto');
var mongoose = require('mongoose'),
User = mongoose.model('User');
var passport = require('passport');
var jwt = require('express-jwt');
var secret = 'secret';
var auth = jwt({secret: secret, userProperty: 'payload'});

module.exports = {
    Register: function(req, res, next){
        if(!req.body.username || !req.body.password){
            return res.status(400).json({message: 'Please fill out all fields'});
    }
    User.findOne({username: req.body.username}, function(err, user){
        console.log('searching...')
        if(err){
            // console.log(err)
            return res.json({error: 'This username already exists.'})
        } else {
            var user = new User();
            console.log(req.body.email)
            user.username = req.body.username;
            user.setPassword(req.body.password);
            user.email = (req.body.email);
            user.save(function (err){
                if(err){ 
                    console.log(err)
                    return next(err);
                }
            return res.json({token: user.generateJWT()})
            })
        }
    })
},

application structure

-Root Folder/
--Client/
---angular/
---partials/
---static/
---index.html
--node_modules/
--passport/
---passport.js
--server/
---config/
----mongoose.js
----routes.js
---controllers/
----user_controller.js
---models/
----user_model.js
--packages.json
--server.js
1
  • Have you exported your User model? Commented Aug 9, 2016 at 21:17

1 Answer 1

2

I think you have forgot to export your User model.

Replace :

mongoose.model('User', UserSchema);

with

var User = mongoose.model('User', UserSchema);
module.exports = User;

Using multiple connection:

Instead of mongoose.model, you need to use conn.model

replace :

User = mongoose.model('User');

with:

User = conn.model('User');

and dont forget to define the conn in the same file.

var conn      = mongoose.createConnection('mongodb://localhost/testA');
Sign up to request clarification or add additional context in comments.

5 Comments

Thank you Ravi, I did leave that out but my concern has more to do with picking which database to save to. How do I save to conn2 once it is exported?
I have edited the answer, hope that solves your issue.
Works perfectly! Thanks Ravi.
If it works for you, please upvote my answer. I am glad I was able to help you.
Unfortunately I am still a new user on Stack overflow so it wont allow me to upvote. It has stored that I have upvoted you and it will be added once my rep is up.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.