2017-10-15 4 views
0

Salut, je suis débutant à exprimer et promettre, j'essaie d'appeler plusieurs fonctions asynchrones en utilisant promise.all de routeur express, mais il revient indéfini, s'il vous plaît guide-moi pour résoudre le problème.Express js promise.all renvoie undefined

user.js // itinéraires

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 // modèles

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; 
+1

Une erreur de débutant, en retournant quelque chose d'un rappel, le renvoie à l'appelant du rappel et non à l'endroit où le rappel est créé. Lisez 'getAllUsers' attentivement. En fait, cela ne rapporte rien. –

Répondre

1

userModel.getAllUsers(req) doivent retourner Promise a.e .:

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

Dans votre cas dbConnection.query(getAllUsers, function(error, results, fields) retourne Promise vous pouvez donc écrire quelque chose comme:

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);      
      } 
      }) 
    });  
}, 
+0

Oui, vous avez raison, retour Promesse est le problème et dbConnection.query ne retourne pas la résolution de la promesse ou rejeter – veeran

1

Votre fonction getAllUsers devrait revenir Promise, mais est de retour indéfini (rien).

La promesse est renvoyée à dbConnection.query mais pas à la fonction getAllUsers.

Vous pouvez essayer d'ajouter return.

return dbConnection.query

si cela ne fonctionne pas, alors dbquery ne retourne pas le rappel qui lui avait été retournée.

Vous devrez peut-être trouver une alternative pour résoudre ce problème.

Faites-moi savoir si cela fonctionne.

0

Ce que je n'est i placé la DbConnection au sein de la fonction promesse et je peux maintenant revenir promesse avec les résultats de 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})); 
      } 
     }); 
     }); 

Merci pour votre réponse immédiate, je compris réellement question est à cause de retour de promesse de vos réponses.

+0

Vous acceptez d'accepter une réponse vous a aidé à trier les choses. –