Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Queries hang when using mongoose.createConnection() vs mongoose.connect()

Works:

var mongoose = require('mongoose');  var db = function() {   return {     config: function(conf) {       mongoose.connect('mongodb://' + conf.host + '/' + conf.database);       var db = mongoose.connection;       db.on('error', console.error.bind(console, 'connection error:'));       db.once('open', function callback() {         console.log('db connection open');       });     }   }; };  module.exports = db(); 

Doesn't work:

var mongoose = require('mongoose');  var db = function() {   return {     config: function(conf) {       var db = mongoose.createConnection('mongodb://' + conf.host + '/' + conf.database);       db.on('error', console.error.bind(console, 'connection error:'));       db.once('open', function callback() {         console.log('db connection open');       });     }   }; };  module.exports = db(); 

Insert code:

'use strict';   var mongoose = require('mongoose'), User = mongoose.model('User'), p = require('../lib/promise');  ... app.post('/user', function (req, res) {   res.format({     json: function () {       //extract the user from the req       try {         var user = new User();         user.firstName = req.body.firstName;         user.lastName = req.body.lastName;         user.userName = req.body.userName;         user.password = req.body.password;         user.email = req.body.email;          user.save(function(err, data) {         //omitted ... 
like image 682
binarygiant Avatar asked Apr 01 '14 12:04

binarygiant


People also ask

What is the difference between Mongoose connect and Mongoose createConnection?

connect() is use, whereas if there is multiple instance of connection mongoose. createConnection() is used. Hope someone can clarify more about this.

Which Mongoose method is used to connect to the database?

You can require() and connect to a locally hosted database with mongoose. connect() , as shown below. You can get the default Connection object with mongoose.

Does Mongoose connect return a promise?

You don't handle a Promise with a callback: mongoose call you're callback if provided, otherwise it return the Promise.

What does Mongoose Connect do?

Mongoose lets you start using your models immediately, without waiting for mongoose to establish a connection to MongoDB. mongoose. connect('mongodb://localhost:27017/myapp'); const MyModel = mongoose.


1 Answers

Unfortunately, this isn't a simple refactor.

1) .createConnection vs .connect

When using .createConnection, you access models via the explicit connection you create with this call.

This means that instead of User = mongoose.model(...) you need User = db.model(...).

Examples (one, two, three, four) show this isn't complicated but the change is subtle enough that many people miss it. The docs aren't super clear on this either, which is probably the root cause.

2) your kraken app & .createConnection

If you are building on one of the kraken examples, you'll need to make several changes.

  1. Change the code around .createConnection so you can access the object that is returned. In the current form, you are returning an object with a config function but you don't return the connection object that .createConnection generates.
  2. Update index.js if you change the way you configure/create the connection in db.config. You might be able to avoid this, but I suspect you'll rewrite the entire db.js around the new call.
  3. Make sure code/controllers working with models have access to the object your .createConnection returned. This means both a way to access the object and changing anyplace you set a variable so it uses the format var xyz = db.model('XYZ'), etc.

Sorry that there isn't a simple one-line answer...

like image 142
Matthew Bakaitis Avatar answered Nov 16 '22 15:11

Matthew Bakaitis