-3

I have the following code where newUsers are not known outside of mongoose call. I have to return newUsers list.

Struggling for a long time. But not getting anything immproved.

exports.list = function(req, res) {

      User.find({ 'roles': 'user' }, '-salt -password -providerData').sort('-created').populate('user', 'displayName').lean().exec(function(err, users) {
        if (err) {
          return res.status(422).send({
            message: errorHandler.getErrorMessage(err)
          });
        }
        var i;
        var newUsers = [];
        users.forEach(function(user) {
          Customer.find({ user: user._id }).exec(function(err, customers) {
            if (err) {
              return res.status(400).send({
                message: errorHandler.getErrorMessage(err)
              });
            }
            user.customers = customers.length;
            newUsers.push(user);
            console.log(newUsers.length); // newUsers are known here
           return newUsers; **// does not workout**
          });
            console.log(newUsers.length); //newUsers are not known here
        });
      });
    };
Shubham Verma
  • 8,783
  • 6
  • 58
  • 79
Sam
  • 5,040
  • 12
  • 43
  • 95

2 Answers2

1
exports.list = function (req, res) {
    User.find({ 'roles': 'user' }, '-salt -password -providerData').sort('-created').populate('user', 'displayName').lean().exec(function (err, users) {
        if (err) {
            return res.status(422).send({
                message: errorHandler.getErrorMessage(err)
            });
        }
        var i;
        var newUsers = [];
        users.forEach(function (user) {
            Customer.find({ user: user._id }).exec(function (err, customers) {
                if (err) {
                    return res.status(400).send({
                        message: errorHandler.getErrorMessage(err)
                    });
                }
                user.customers = customers.length;
                newUsers.push(user);
                console.log(newUsers.length, newUsers);
            });
        });
    });
};

You need to read about asynchronious programming

Jackson
  • 884
  • 2
  • 13
  • 22
0

You are returning inside the forEach(), As i think you should return outside the forEach() for better result.

Please try below code, Hope it will work for you :

exports.list = function (req, res) {
    User.find({ 'roles': 'user' }, '-salt -password -providerData').sort('-created').populate('user', 'displayName').lean().exec(function (err, users) {
        if (err) {
            return res.status(422).send({
                message: errorHandler.getErrorMessage(err)
            });
        }
        var i;
        var newUsers = [];
        users.forEach(function (user) {
            Customer.find({ user: user._id }).exec(function (err, customers) {
                if (err) {
                    return res.status(400).send({
                        message: errorHandler.getErrorMessage(err)
                    });
                }
                user.customers = customers.length;
                newUsers.push(user);
            });
        });
        console.log(newUsers.length);
        return newUsers;
    });
};
Shubham Verma
  • 8,783
  • 6
  • 58
  • 79