简体   繁体   English

如何用mongoose尊重NodeJS应用程序中的执行顺序

[英]How to respect execution order in NodeJS application with mongoose

please help me understand how can I solve this. 请帮我理解如何解决这个问题。

this is my routes file (auth-routes.js) 这是我的路线文件(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)
  })
}

and this is my controller file (user.js) 这是我的控制器文件(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
}

and in the console results are printed like this: 并在控制台结果打印如下:

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

instead of printing in the correct order, something similar like this: 而不是以正确的顺序打印,类似这样的东西:

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

Thanks! 谢谢!

your findOne function take time to fetch the data from database so it does not stop the flow of the execution of logic because :- 你的findOne函数需要花时间从数据库中获取数据,因此它不会停止逻辑执行的流程,因为: -

  • Node Js is Single thread is doesnt stop .All you can achive in callback functions. Node Js是单线程并没有停止。你可以在回调函数中实现。
  • Its is non-blocking I/O model 它是非阻塞I / O模型

So , you can do it like this:- 所以,你可以这样做: -

    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 the things you want to be done just do it when result comes from database 当结果来自数据库时,您想要完成的所有事情都是这样做的

You will need callback mechanism. 您将需要回调机制。 NodeJS is event based nonBlockingIO. NodeJS是基于事件的nonBlockingIO。 So your control will not stop till the DB call is executed hence your info variable is returned before you get result from DB 因此,在执行DB调用之前,您的控件不会停止,因此在从DB获取结果之前会返回您的info变量

Let me know if you need more help on this. 如果您需要更多帮助,请告诉我。

Your controller function should look like this 您的控制器功能应该如下所示

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

Your route file should look like this 您的路径文件应如下所示

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM