[英]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函数需要花时间从数据库中获取数据,因此它不会停止逻辑执行的流程,因为: -
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.