'How to get data from multiple model in single controller in NodeJS?

I am working on nodejs and i am using "Express js" framework, I am working on Controller and i am trying to get data from "two model functions" but i am getting message "anonymous", How can i get data from multiple "model functions", Here is my code,

  • This is my homeController
homeController.index = function (req, res, next) {
  // fetching data into 'data variable' from FetchRecords model
  homeModel.FetchRecords(function (err, data) {
    if (err) {
      req.flash('error', 'There was no records.');
    } else {
      res.render('home/index', { data: data });
    }
  });

  homeModel.getAverage(function (average) {
    console.log(average);
    // res.render('home/index',{data:average});
  });
};
  • This is my homeMOdel
homeModel.FetchRecords = function (data) {
  sql.query('SELECT * FROM rating', function (err, res) {
    if (err) {
      return data(err, null);
    } else {
      return data(null, res);
    }
  });
};

homeModel.getAverage = function (average) {
  console.log(average);
  sql.query('SELECT avg(value) FROM rating', function (err, res) {
    if (err) {
      return average(err, null);
    } else {
      return average(null, res);
    }
  });
};


Solution 1:[1]

Inside homeModel just create 1 function instead of 2 separate. You can combine both MySQL queries into one like this.

const FetchRecordsAndAverage = function (data) {
      sql.query('SELECT * FROM rating; SELECT avg(value) FROM rating', function (err, res) {
        if (err) {
          return data(err, null);
        } else {
          return data(null, res);
        }
      });
    };

module.exports = { 
    FetchRecordsAndAverage
}

With this you will get combined data of both queries as arrays inside array. Result of queries can be accessed as data[0] & data[1].

Solution 2:[2]

You should export the function from the home model:

const FetchRecords = function (data) {
    sql.query('SELECT * FROM rating', function (err, res) {
      if (err) {
        return data(err, null);
      } else {
        return data(null, res);
      }
    });
  };
  
const getAverage = function (average) {
    console.log(average);
    sql.query('SELECT avg(value) FROM rating', function (err, res) {
      if (err) {
        return average(err, null);
      } else {
        return average(null, res);
      }
    });
  };

module.exports = { 
    FetchRecords,
    getAverage
}

And retrieve them in your application by calling:

const { FetchRecords, getAverage } = require('./path/to/home_model');

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Emaad Infotech
Solution 2 lpizzinidev