2017-10-15 8 views
0

こんにちは、私は初心者ですが、明示的なルータからpromise.allを使って複数の非同期関数を呼び出そうとしていますが、未定義を返します。Express js promise.allは未定義です

user.jsの//ルート

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の//モデル

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

初心者の間違いで、コールバックから何かを返すと、コールバックが作成されていないコールバックの呼び出し元に戻ります。 'getAllUsers'を注意深く読んでください。実際、それは何も返さない。 –

答えて

1

userModel.getAllUsers(req)Promise a.eを返す必要があります。:

function getAllUsers(req) { 
    return new Promise(function(resolve, reject){ 
    //... 
    }); 
} 
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

はい、あなたが正しいです返すプロミスが問題であり、dbConnection.queryが約束を返すか拒否しています – veeran

1

あなたgetAllUsers機能がPromiseを返すことが期待されていますが、(何も)、undefinedを返しますされていますので、あなたのような何かを書くことができPromiseを返しdbConnection.query(getAllUsers, function(error, results, fields)あなたの場合は。

約束はdbConnection.queryに返されますが、getAllUsers関数には返されません。

returnを追加できます。

return dbConnection.query

これが動作しない場合は、dbQueryタグは、それに戻されたコールバックを返しません。

これを解決するには、別の方法が必要な場合があります。

動作するかどうか教えてください。私は私が約束関数内のDBConnectionを置かなかったし、今私は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})); 
      } 
     }); 
     }); 

おかげで、実際に私はのために問題がある理解何

0

あなたの答えから約束を返す。

+0

何かを受け入れることを歓迎して、物事を整理するのに役立ちました。 –

関連する問題