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

时间:2017-04-26 01:14:05

标签: javascript node.js mongodb express asynchronous

请帮助我理解如何解决这个问题。

这是我的路线文件(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:---->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 }

而不是按照正确的顺序打印,类似这样的内容:

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

谢谢!

2 个答案:

答案 0 :(得分:0)

你的findOne函数需要花时间从数据库中获取数据,因此它不会停止逻辑执行的流程,因为: -

  • Node Js 单线程并没有停止。你可以在回调函数中实现。
  • 非阻塞I / O模型

所以,你可以这样做: -

this.finish()

当你的结果来自数据库

时,你想要做的所有事情都是这样做的

答案 1 :(得分:0)

您需要回调机制。 NodeJS是基于事件的nonBlockingIO。因此,在执行DB调用之前,您的控件不会停止,因此在从DB获得结果之前返回info变量

如果您需要更多帮助,请与我们联系。

您的控制器功能应如下所示

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

您的路线文件应如下所示

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