por favor ayúdame a entender cómo puedo resolver esto.
este es mi archivo de rutas (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) }) }y este es mi archivo de controlador (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 }y en la consola los resultados se imprimen así:
----username:---->cesar4@mail.com<--------------- Salio del FinOne ---------------->Ya esta en routes-->[object Object] POST /auth/recuperarpassword 500 42.647 ms - 27 Dentro del findOne ------>user:-->{ _id: 58fe681cb615c91f9d71adfb, username: 'cesar4@mail.com', password: 'hash', __v: 0 }en lugar de imprimir en el orden correcto, algo similar a esto:
----username:---->cesar4@mail.com<--------------- Dentro del findOne ------>user:-->{ _id: 58fe681cb615c91f9d71adfb, username: 'cesar4@mail.com', password: 'hash', __v: 0 } Salio del FinOne ---------------->Ya esta en routes-->[object Object] POST /auth/recuperarpassword 500 42.647 ms - 27¡Gracias!
su función findOne toma tiempo para obtener los datos de la base de datos para que no detenga el flujo de la ejecución de la lógica porque: -
Entonces, puedes hacerlo así: -
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; }); };Todas las cosas que desea hacer simplemente hágalo cuando el resultado provenga de la base de datos
Necesitará un mecanismo de devolución de llamada. NodeJS no es BlockingIO basado en eventos. Por lo tanto, su control no se detendrá hasta que se ejecute la llamada DB, por lo tanto, su variable de info se devuelve antes de obtener el resultado de DB
Avísame si necesitas más ayuda con esto.
Su función de controlador debería verse así
'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 };Su archivo de ruta debería verse así
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) } }); }) };