veeran
veeran

Reputation: 362

Express js promise.all returns undefined

Hi i am newbie to express and promise, i am trying to call multiple asynchronous function using promise.all from express router, but it returns undefined, please guide me to solve the issue .

user.js //routes

var findAllUsersDetails = function(router){
        router.post('/api/v1/users/getAllUserFormDetails', 
        function (req, res) {
            Promise.all([
                userModel.getAllUsers(req), 
                userModel.getAllUsers(req), 
            ])
            .then((data) => console.log(data))
            .catch((err) => console.log(err))
    });
}

user.js // models

var userModel = {
getAllUsers : function(req){
    var string = "";
    var id_company = req['user'].id_company;
    var dbConnection = dbConnectionCreator();
    var getAllUsers = getAllUsersSqlString(string, id_company);
    console.log("ANGEL: finding all employees");

    dbConnection.query(getAllUsers, function(error, results, fields){
        return new Promise((resolve, reject) => {
              console.log(results);
            if (error) {
                dbConnection.destroy();
                console.log("error: ", error);
                return reject (err);
            } else if (results.length === 0) {
                resolve("User not found.");
            } else {
                resolve(results);
                //return (callback({employeeData: results}));
            }
          })
    });     
},
}
module.exports = userModel;

Upvotes: 0

Views: 768

Answers (3)

veeran
veeran

Reputation: 362

What i did is i placed the dbconnection within promise function and now i can return promise with the results of dbConnection.query()

getAllUsers : function(req){
    var string = "";
    var id_company = req['user'].id_company;
    var dbConnection = dbConnectionCreator();
    var getAllUsers = getAllUsersSqlString(string, id_company);
    console.log("ANGEL: finding all employees");

    return new Promise((resolve, reject) => { 
        dbConnection.query(getAllUsers, function(error, results, fields){ //
          console.log(results);
            if (error) {
                dbConnection.destroy();
                console.log("error: ", error);
                return reject (err);
            } else if (results.length === 0) {
                resolve("User not found.");
            } else {
                resolve(results);
                //return (callback({employeeData: results}));
            }
        });
      });

Thanks for your immediate reply, actually i understood issue is because of returning promise from your answers.

Upvotes: 0

Maxim Shoustin
Maxim Shoustin

Reputation: 77904

userModel.getAllUsers(req) should return Promise a.e.:

function getAllUsers(req) {
   return new Promise(function(resolve, reject){
     //...
   });
 }

In your case dbConnection.query(getAllUsers, function(error, results, fields) returns Promise therefore you can write something like:

getAllUsers : function(req){

    var string = "";
    var id_company = req['user'].id_company;
    var dbConnection = dbConnectionCreator();
    var getAllUsers = getAllUsersSqlString(string, id_company);
    console.log("ANGEL: finding all employees");

    return dbConnection.query(getAllUsers, function(error, results, fields){
//   ^^^
        return new Promise((resolve, reject) => {
              console.log(results);
            if (error) {
                dbConnection.destroy();
                console.log("error: ", error);
                return reject (err);
            } else if (results.length === 0) {
                resolve("User not found.");
            } else {
                resolve(results);                    
            }
          })
    });     
},

Upvotes: 1

Abhinav Jain
Abhinav Jain

Reputation: 339

Your getAllUsers function is expected to return Promise, but is returning undefined(nothing).

The promise is returned to dbConnection.query but not to the getAllUsers function.

You can try adding return.

return dbConnection.query

if this doesn't work, then dbquery doesn't return the callback which was returned to it.

You might need to find an alternative to solve this.

Let me know if it works.

Upvotes: 1

Related Questions