0

I am developing Restful API using Javascript(ES6). For below code piece, I have two table Lecturer and Course. I am trying to send all courses that particular lecturer has.

api.get('/getCourses/:lecturer_id', (req, res) => { 
    let myCourses = [];
    let send = true;
    Lecturer.findById(req.params.lecturer_id, (err, lecturer) => {
      if(err) {
        res.json({ ok : '0'});
      } else {
        lecturer.courses.forEach(value => {
          Course.findById(value, (err, course) => {
            console.log(value);
            if(err) {
              res.json({ok : '0'});
              send = false;
            } else {
              console.log('in else');
              console.log(course)
              myCourses.push(course);
              console.log(myCourses.length);
            }
            console.log(myCourses.length);
          });
          console.log('outside1');
        });
        console.log('outside');
        res.json(myCourses);
      }
    });
  });

But in here, in the console "outside1" and "outside" are not printed. As a result the "myCourses" array returns empty. Can you explain what is my problem. Thank you.

2 Answers2

0

Rather than doing what you have done I will suggest you to use promises. See the codes below. It is doing the same thing what you are doing but in a very cleaner and elegant way.

api.get('/getCourses/:lecturer_id', (req, res) => { 
    let myCourses = [];
    let send = true;
    Lecturer.findById(req.params.lecturer_id, (err, lecturer) => {
      if(err) {
        res.json({ ok : '0'});
      } else {

        Promise.all(lecturer.courses.map(function(value){
          return Course.findById(value).exec();
        })).then(function(allCourses){
          //allCourses is array of courses
          res.json(allCourses);
        }).catch(function(err){
          //error happened while fetching courses
        })
      }
    });
  });
nurulnabi
  • 459
  • 3
  • 11
0

I've tried your code, and it's working. How did you define your models? Mine looked like this:

// Lecturer
const mongoose = require('mongoose');

const lecturerSchema = new mongoose.Schema({
  id: { type: 'ObjectId', unique: true },
  courses: [ { type: 'ObjectId', ref: 'Course' } ]
});

const Lecturer = mongoose.model('Lecturer', lecturerSchema);

module.exports = Lecturer;

// Course
const mongoose = require('mongoose');

const courseSchema = new mongoose.Schema({
  id: { type: 'ObjectId', unique: true }
});

const Course = mongoose.model('Course', courseSchema);

module.exports = Course;

Some extra remarks:

  • you can search for courses with Course.find({ '_id': { $in: lecturer.courses } })
  • validate :lecturer_id before actually using it
  • check if you get any searched results, because lecturer can be null
  • have a look at Mongoose Promises
dudko
  • 193
  • 1
  • 7