Você não pode use um resultado assíncrono como o valor de retorno de uma função. É simples assim. Você precisa entregar o resultado assíncrono ao chamador por meio de um retorno de chamada fornecido como um parâmetro para a função (ou usar futuros/promessas e efetivamente adiar essa etapa, mas isso é mais complicado).
if_exists
deve ficar assim:var if_exists = function(query, where, callback) {
require('mongodb').connect(DB.mongo_url, function(err, db) {
db.collection(where, function(err, coll) {
coll.findOne(query, function(e, r) {
//console.log(r);
if (r === null) {
callback(e, false);
} else {
callback(e, true);
}
// You should either close db here or connect during start up
// and leave it open.
db.close();
});
});
});
}