2017-04-26 20 views
1

どうすればこの問題を解決できるか理解してください。マングースでNodeJSアプリケーションの実行順序を尊重する方法

これは私のルートファイル(AUTH-routes.js)

const userControllers = require('../controllers/user') 
module.exports = function(app){ 
    app.post('/auth/recuperarpassword', function(req, res){ 
    var info = userControllers.recuperarPassword(req, res) 
    console.log('---------------->there is in routes file-->' + info); 
    res.status(500).send(info) 
    }) 
} 

であり、これは私のコントローラファイル(user.jsの)

'use strict' 
const User = require('../models/user') 
const bcrypt = require('bcrypt-nodejs') 
var momenttz = require('moment-timezone'); 
var mongoose = require('mongoose') 
function recuperarPassword(req,res){ 
    var username = req.body.username.toLowerCase().trim(); 
    console.log('----username:---->' + username + '<---------------'); 
    var info; 
    User.findOne({username: username}, function(err,user){ 
     console.log('Dentro del findOne'); 
     if (err) { 
     console.log('--->Error - Error al buscar username en BD') 
     return err 
     } 
     console.log('------>user:-->'+ user); 
    }) 
    console.log('Salio del FinOne'); 
    info = {descerror: 'Elcomercio '} 
    return info 
} 
module.exports = { 
    recuperarPassword 
} 

、コンソールであります結果は次のように表示されます。

----username:---->[email protected]<--------------- 
Salio del FinOne 
---------------->Ya esta en routes-->[object Object] 
POST /auth/recuperarpassword 500 42.647 ms - 27 
Dentro del findOne 
------>user:-->{ _id: 58fe681cb615c91f9d71adfb, 
    username: '[email protected]', 
    password: 'hash', 
    __v: 0 } 
代わりに、正しい順序で印刷の

、このような類似した何か:

----username:---->[email protected]<--------------- 
Dentro del findOne 
------>user:-->{ _id: 58fe681cb615c91f9d71adfb, 
    username: '[email protected]', 
    password: 'hash', 
    __v: 0 } 
Salio del FinOne 
---------------->Ya esta en routes-->[object Object] 
POST /auth/recuperarpassword 500 42.647 ms - 27 

感謝を!

答えて

0

コールバックメカニズムが必要です。 NodeJSはイベントベースのnonBlockingIOです。 DBコールが実行されるまでコントロールが停止しないので、DBから結果を得る前にinfo変数が返されます

これについてさらに助けが必要な場合はお知らせください。

お使いのコントローラ機能は、この

const userControllers = require('../controllers/user') 
module.exports = function(app){ 
    app.post('/auth/recuperarpassword', function(req, res){ 
    userControllers.recuperarPassword(req, res, function(data){ 
     if(data === false){ 
     //there was error in your controller DB call 
     }else{ 
     console.log('---------------->there is in routes file-->' + data); 
     res.status(500).send(data) 
     } 
    }); 
    }) 
}; 
+0

ありがとう助けてください。 –

0

ので、あなたのfindOne機能は、それがロジックの実行の流れを止めないように、データベースからデータをフェッチするために時間がかかる: - ノードのJsはシングルスレッドある

  • 。すべてのことができますdoesntの停止でありますコールバック関数が有効になります。
  • そのので

、ノンブロッキングI/Oモデルである、あなたはこのようにそれを行うことができます: -

exports.recuperarPassword = function(req, res) { 
     var username = req.body.username.toLowerCase().trim(); 
     console.log('----username:---->' + username + '<---------------'); 

     User.findOne({ username: username }, function(err, user) { 
      console.log('Dentro del findOne'); 
      if (err) { 
       console.log('--->Error - Error al buscar username en BD') 
       return err; 
      } 
      console.log('------>user:-->' + user); 
      console.log('Salio del FinOne'); 
      user.info= { descerror: 'Elcomercio ' }; //if you want to use info object 

      return user; 
     }); 


}; 

あなたが行うことにしたいすべてのものは、ちょうどその時にそれを行いますデータベースからの結果です。

+0

この文句を言わない仕事のようになります。この

'use strict' const User = require('../models/user') const bcrypt = require('bcrypt-nodejs') var momenttz = require('moment-timezone'); var mongoose = require('mongoose') function recuperarPassword(req,res, callback){ var username = req.body.username.toLowerCase().trim(); console.log('----username:---->' + username + '<---------------'); var info; User.findOne({username: username}, function(err,user){ console.log('Dentro del findOne'); if (err) { console.log('--->Error - Error al buscar username en BD'); callback(false); return err } console.log('------>user:-->'+ user); callback(user) }); } module.exports = { recuperarPassword }; 

あなたのルートファイルのようになります。 'info'をコールバック関数から返すので、そのコールバック関数の戻り値は' info'ですが、それでもルートファイルでは利用できません。これを解決するには、コールバックメカニズムが必要です。私の答えを見てください。私はあなたのアドバイスでそれを解決するホープは、@ダーディ – Hannan

関連する問題