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

标签 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)
  })
}

这是我的 Controller 文件 (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

谢谢!

最佳答案

您将需要回调机制。 NodeJS 是基于事件的非阻塞 IO。因此,在执行数据库调用之前,您的控制不会停止,因此您的 info 变量会在您从数据库获取结果之前返回

如果您需要更多帮助,请告诉我。

您的 Controller 函数应如下所示

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

关于javascript - 如何使用 mongoose 尊重 NodeJS 应用程序中的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43623391/

相关文章:

javascript - 切换成员角色

javascript - 在 JavaScript 中查找单词数组中的第 n 个字符

javascript - 当 html 被输入到 textarea 中时,如何渲染它?

javascript - 打印 javascript 数组中的重复项数

javascript - 如何在nodejs中先实现mysql查询? (或者先实现条件查询)

node.js - Sails 从另一个 Controller 调用一个 Controller

来自 mongodb GridFS 的 HTML5 音频

javascript - session.socket.io错误: could not look up session by key: connect. sid

android - mongodb stitch android电子邮件/密码注册404错误

node.js - 什么导致 AWS Lambda 上的 Mongodb 超时错误?