Connecting to MongoDB using Mongoose in multiple files
You need to require Mongoose
and open a new connection to it in your server.js
so you can access it through different modules.
Suppose you are using both express and body-parser
server.js:
. . .var mongoose = require('mongoose');var port = process.env.PORT || 3000;var express = require('express');var bodyParser = require('body-parser');. . .var app = express();mongoose.connect("mongodb://localhost/MyApp");. . .app.use(bodyParser.json());. . .require('./app/routes.js')(app);app.listen(port);console.log('App listening on port ' + port);
Then, you can access it easily. Let's suppose you want to set-up a mongoose schema
.
mySchema.js:
var mongoose = require('mongoose');var Schema = mongoose.Schema;var user = new Schema({ name: {type: String, required : true}});module.exports = mongoose.model('user', user);
Or you just want to retrieve all user or save a new user to the user collection, supposing you are passing it an object req
which has some properties like name:
user.factory.js
require('mongoose');var User = require('mySchema.js');exports.getUsers = getUsers;exports.postUser = postUser;function getUsers() { return new Promise( function (resolve, reject) { var query = User.find({}); query.exec(function(err, users) { if (err){ return reject({err : 'Error while fetching users'}); } // If no errors are found, it responds with a JSON of all users return resolve(users); }); });}function postUser(req) { return new Promise( function (resolve, reject) { // Creates a new User based on the Mongoose schema and the post body var newUser = new User(req.body); // New User is saved in the db. newUser.save(function(err) { console.log('err',err); if (err){ return reject({err : 'Error while saving new user'}); } // If no errors are found, it responds with a JSON of the new users return resolve(req.body); }); });}
Also, suppose you want to set-up a route to intercept http
requests. For instance, a request to save a new user.
routes.js:
var UserFactory = require('./factories/user.factory.js');// Opens App Routesmodule.exports = function(app) { /** Getting all the users **/ app.get('/users', function(req, res) { UserFactory.getUsers().then( function (users) { res.json(users); }, function (error) { res.json(error); }); }); /** Posting a new geometry **/ app.post('/users', function(req, res) { UserFactory.postUsers(req).then( function (user) { return res.json(user); }, function (error) { res.json(error); }); });}
And, on the front-end, the user inserts a user name in a form, then clicks on submit button and you call a createNewUser
function:
. . .var createNewUser = function(userName){ var user = { name : userName //Goofy }; console.log(user.name); //Goofy postNewUser(user).then( function( response, err){ if(err){ console.log('Error while saving new user'); } else { console.log('User '+response+' successfully saved'); } });}function postNewUser(user){ return new Promise(function (resolve, reject) { // Saves user data to the db $http.post('/users', user) .success(function(res) { if(res.error){ return reject(res.error); } return resolve(res); }); }); }
You can also set mongoose globally in your server.js so you don't need to require it in your modules
var mongoose = require('mongoose');. . .global.mongoose = mongoose;
Hope I've been helpful.