0

I'm trying to make a find() request with mlab. Im using express in my main file (Controller) to route it to the function in my model and over there do the find() from DB. When the app enters this func it probably still didn't connect to the DB so the code inside conn.once isn't running.

so I moved mongooe.connect inside the method and now the client is getting an empty answer. I think the contriller returning an answer before find is finished.

//index.js (the controller)

    const   express     = require('express');
    app         = express(),
    data        = require('./data/securitySettingsDB.json'),
    port        = process.env.PORT || 3000,
    bodyParser  = require('body-parser'),
    methods     = require('./modules');
    var method = methods();
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({extended: true }));

    app.use(express.static('public'));
    app.get('/', (req,res) => {
        console.log('Trace: API Page');
        res.sendFile(__dirname + '/api/index.html');
    });
    app.get('/getAllUsers/', (req, res) => {
      res.setHeader('Debug', 'getAllUsers was reached');
      res.status(200).json(method.getAllUsers());
    });

    app.listen(port);
    console.log('listening on port ${port}');

//the module

    const consts      = require('../models/consts'),
          mongoose    = require('mongoose');
    var User = require('../models/user');
    class Methods {

      getAllUsers() {
          console.log("Trace : getAllUsers()");
          mongoose.connect(consts.MLAB_KEY);
          conn.on('error', (err) => {
             console.log(`connection error: ${err}`);
          });
          conn.once('open', () => {
             console.log(`once`);
             User.find({}, (err, user) => {
               if(err){
                 console.log(`query error ${err}`);
                 mongoose.disconnect();
               return {"error": err}
               }
               else console.log(`ok`);
               console.log(user);
               mongoose.disconnect();
               return user;
          });
      });
     console.log(`returned from query`);
     }
    module.exports = function() {
    var methods = new Methods();
    return methods;
    }

the Model

var mongoose = require('mongoose'),
schema = mongoose.Schema,
userSchema = new schema({
user_name:  {type:String, index:1, required:true, unique:true},
password:   {type:String, required:true},
email:      {type:String, required:true},
first_name: {type:String, required:true},
last_name:  {type:String, required:true},
settings:   {
  login_alerts: {type:Boolean, required:true},
  recognized_devices: [String]
},
phone_to_aproove_password_change: String
});

var User = mongoose.model('User', userSchema);
module.exports = User;
SteveBl
  • 253
  • 4
  • 12
  • Possible duplicate of [How do I return the response from an asynchronous call?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – Yury Tarabanko May 17 '17 at 12:46

1 Answers1

0

Node.js is asynchronous. You need make some fixes:

 getAllUsers(clb) {
  console.log("Trace : getAllUsers()");
  mongoose.connect(consts.MLAB_KEY);
  conn.on('error', (err) => {
     console.log(`connection error: ${err}`);
  });
  conn.once('open', () => {
     console.log(`once`);
     User.find({}, (err, user) => {
       if(err){
         console.log(`query error ${err}`);
         mongoose.disconnect();
         return clb({"error": err});
       }
       else console.log(`ok`);
       console.log(user);
       mongoose.disconnect();
       clb(null, user);
  });

And use it like this

app.get('/getAllUsers/', (req, res) => {
      method.getAllUsers(function(err, users){
         if(err){
            throw err;
         }
         res.setHeader('Debug', 'getAllUsers was reached');
         res.status(200).json(users);
        });
      })
  });
Sergaros
  • 821
  • 1
  • 5
  • 14