reggie
reggie

Reputation: 3674

Using variables in modules of Node Express application

The express generator creates an app like this: in the main app.js:

var app = express();
//...
var routes = require('./routes/index');
app.use('/', routes);
//...

in routes/index.js

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

module.exports = router;

What is the best way to use variables that I define in app.js in the index.js? For example, before defining the routes, I set up the mongoose model:

var myModel;

mongoose.connect('mongodb://localhost/test');
var db = mongoose.connection;

db.once('open', function (callback) {
    //load schemas
    var dbSchema = require('./schema');
    myModel = mongoose.model('mymodel', dbSchema.myModel);
});

How can I use 'myModel' in the routes module?

Upvotes: 0

Views: 353

Answers (2)

laggingreflex
laggingreflex

Reputation: 34677

You should define your models outside app.js, in their own separate files for each separate model, and export that model which you can then require in various places you need it. Your model definition doesn't actually need to be inside db.once('open'

For example: if you have a model User you should define it in its own file like this:

db/user.js

var mongoose = require('mongoose');
var schema = mongoose.Schema({
    …
});
var model = mongoose.model('user', schema);
module.exports = model;

This way if you want to use the User model inside your routes/index.js:

…
var User = require('../db/user');
router.get('/user/:id', function(req, res, next) {
    User.findById(req.params.id, function(err, user){
        res.render('user', { title: 'Express', user: user});    
    });
});

Upvotes: 1

Bidhan
Bidhan

Reputation: 10697

Pass it as a parameter when you require your router in your app.js file. You're going to have to slightly modify your index.js file

var express = require('express');
var myRouter = function(myModel) {
    var router = express.Router();

    /* GET home page. */
    router.get('/', function(req, res, next) {
      res.render('index', { title: 'Express' });
    });

    // You can use your myModel model here

    return router;
}

module.exports = myRouter

Now inside your app.js

var app = express();
//...
// Pass myModel as a parameter
var routes = require('./routes/index')(myModel);
app.use('/', routes);
//...

Upvotes: 0

Related Questions