Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why mongodb find() never got to my callback

I'm trying build rest-like API using mongodb(with mogoose) and node.js with restify. I'm an absolute novice in the mongo world, and I'm not sure where problem is. Is this the db connection's problem, or something else?

So, I'm doing it this way: rest-server.js

//start server
var restify = require('restify');
var server = restify.createServer();
server.use(restify.bodyParser());

//connect db
var config = require('./Config.js');
var mongoose = require('mongoose'),   
db = mongoose.createConnection('localhost', 'travelers'),
Schema = mongoose.Schema,
ObjectId = mongoose.SchemaTypes.ObjectId;

db.on('error', console.error.bind(console, 'DB connection error:'));
db.once('open', function callback() {
    console.log('db connection open');
});

var LoginModel = require('./models/LoginModel.js').make(Schema, mongoose);
var LoginResource = require('./resource/LoginResource.js')(server, LoginModel);

LoginModel.js

function make(Schema, mongoose) {
    var LoginSchema = new Schema({
        //id: (?)
        username: String,
        password: String,
        traveler_id: Number,
        contact_id: Number,
        last_login: Date,
        token: String
});
    return mongoose.model('Login', LoginSchema);
}

module.exports.make = make;

LoginResource.js

exports = module.exports = function (server, LoginModel) {
    var LoginRepository = require('../repository/LoginRepository.js');

    server.get('/login/:username/:password', function (req, res, next) {    
        LoginRepository.getLogin(req, res, next, LoginModel);
    });
}

LoginRepository.js

function getLogin(req, res, next, LoginModel) {
    var query = LoginModel.find({ username: req.params.username, password: req.params.password});

    query.exec(function (err, docs) {
        console.log('got it!');
        res.send(docs);
    });
}

test query curl localhost:8080/login/qqq/www

So I never got to res.send(docs); Actually, I didn't add anything to the db. I just want to know that the query didn't find anything.

UPDATE: I don't understand why, but this problem can be solved if I change the db connection code like this:

//connect db
var config = require('./Config.js');
var mongoose = require('mongoose/');
db = mongoose.connect(config.creds.mongoose_auth),
Schema = mongoose.Schema;

(use mongoose.connect and define db and Schema vars as global)

but in this case db.on() and db.once() throw an exception "no such methods".

In other words - problem mmm... solved but I still don't know why. This looks like a helpful link: server.js example on github

like image 582
Sergei Panfilov Avatar asked Mar 24 '23 06:03

Sergei Panfilov


1 Answers

Models that you've created by calling mongoose.model() use Mongoose's default connection pool when executing queries. The default connection pool is created by calling mongoose.connect(), and any queries you make using your created models will be queued up until you call that and it completes.

You can also create separate connection pools (that can have their own models!) by calling db = mongoose.createConnection() like you were originally doing, but you would have to create the models for that using db.model() which is why things weren't working for you originally.

like image 59
JohnnyHK Avatar answered Apr 02 '23 13:04

JohnnyHK