2017-04-26 7 views
1

zu respektieren, bitte helfen Sie mir zu verstehen, wie ich das lösen kann.Wie die Reihenfolge der Ausführung in NodeJS-Anwendung mit Mungo

dies ist meine Routen-Datei (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) 
    }) 
} 

und dies ist meine Controller-Datei (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 
} 

und in der Konsole Ergebnisse werden wie folgt gedruckt:

----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 } 

statt Druck in der richtigen Reihenfolge, so ähnlich wie folgt aus:

----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 

Dank!

Antwort

0

Sie benötigen Rückrufmechanismus. NodeJS ist ereignisbasiertes nonBlockingIO. So wird Ihre Steuerung nicht stoppen, bis der DB-Aufruf ausgeführt wird, daher wird Ihre info Variable zurückgegeben, bevor Sie das Ergebnis von DB erhalten

Lassen Sie mich wissen, wenn Sie weitere Hilfe zu diesem Thema benötigen.

Ihre Controller-Funktion wie diese

'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 
}; 

Ihre Route Datei sollte wie folgt aussehen

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

Danke, ich löse es mit Ihren Ratschlägen. –

0

Ihre FindOne Funktion einige Zeit dauern, um die Daten aus der Datenbank zu holen, damit es nicht den Fluss der Ausführung der Logik stoppt, weil: -

  • Knoten JsEinzelfaden ist .Alle doesnt zu stoppen können Sie in Callback-Funktionen.
  • Sein ist nicht blockierende E/A-Modell

Also, Sie es wie folgt tun: -

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; 
     }); 


}; 

All das, was Sie gerade tun es getan werden soll, wenn Ergebnis kommt aus der Datenbank

+0

Dies wird nicht funktionieren aussehen sollte. Sie geben "info" von einer Callback-Funktion zurück, so dass der Rückgabewert dieser Callback-Funktion "info" ist, aber immer noch nicht in der Routendatei verfügbar ist. Sie benötigen einen Callback-Mechanismus, um dies zu beheben. Sieh dir meine Antwort an. Hoffe das hilft @hardy – Hannan

Verwandte Themen