Search code examples
mongodbexpressmeanjs

API that fetches all records from mongoDB using express and mongoskin driver


I am beginner in Mean stack I am developing an API that fetches all records from mongodb using express. But I am not able to fetch all records from the database. I can't figure what I am doing wrong, I am doing it as follows:

This is my main app (server.js)

require('rootpath')();
var express = require('express');
var app = express();
var session = require('express-session');
var bodyParser = require('body-parser');
var expressJwt = require('express-jwt');
var config = require('config.json');

app.set('view engine', 'ejs');
app.set('views', __dirname + '/views');
app.use(bodyParser.urlencoded({
  extended: false
}));
app.use(bodyParser.json());
app.use(session({
  secret: config.secret,
  resave: false,
  saveUninitialized: true
}));

// use JWT auth to secure the api
app.use('/api', expressJwt({
  secret: config.secret
}).unless({
  path: ['/api/users/authenticate', '/api/users/register']
}));

// routes
app.use('/', require('./controllers/login.controller'));
app.use('/register', require('./controllers/register.controller'));
app.use('/app', require('./controllers/app.controller'));
app.use('/api/users', require('./controllers/api/users.controller'));

/*// make '/app' default route
app.get('/', function (req, res) {
    return res.redirect('/app');
});*/

// start server
var server = app.listen(3000, function() {
  console.log('Server listening at http://' + server.address().address + ':' + server.address().port);
});

This is my user.controller.js user will make a request to the api http://localhost:3000/api/users/userList

var express = require('express');
var router = express.Router();
var userService = require('services/user.service');

router.get('/userList', getUserList);

module.exports = router;

function getUserList(req, res) {
  userService.userList()
    .then(function(users) {
      if (users) {
        res.send(users);
      } else {
        res.sendStatus(404);
      }
    })
    .catch(function(err) {
      res.status(400).send(err);
    });
}

This is my user.service.js where I am querying the database to fetch all records using mongoskin driver.

var Q = require('q');
var mongo = require('mongoskin');
var db = mongo.db("mongodb://localhost:27017/EmployeeForm", {
  native_parser: true
});
db.bind('users');

var service = {};

service.userList = userList;

module.exports = service;

function userList() {
  var deferred = q.defer();

  db.users.find(function(err, users) {
    if (err) deferred.reject(err.name + ': ' + err.message);

  });

  return deferred.promise;
}

Solution

  • So i think it's find issue.

    MongoDB find method return cursor by default. https://docs.mongodb.com/manual/reference/method/db.collection.find/

    From https://github.com/kissjs/node-mongoskin they use method toArray which will transform cursor into array of objects like this db.find.toArray(callback)

    So try like this in userList()

    function userList() {
      var deferred = q.defer();
    
      db.users.find({}).toArray(function(err,docs){
         err ? deferred.reject(err) :  deferred.resolve(docs);
      });
    
      return deferred.promise;
    }
    

    Hope this helps.