嗨,我是节点新手,我正在尝试创建注册功能...它检查用户名是否存在以及其他一些验证..但它不是等待从MongoDB获得结果来检查用户是否存在。回调很早就触发了。.请帮助我如何才能按照我想要的方式制作它
var fs = require('fs');
var bcrypt = require('bcrypt-nodejs');
var util = require('./util');
exports.loginValidate = function(user, callback) {
var User = require("../Models/UserSchema").model('User');
User.findOne({
uname: user
}, function(err, userData) {
if (err) console.log(err);
callback(userData);
});
}
exports.createUser = function(data, callback) {
var User = require("../Models/UserSchema").model("User");
var user = new User(data);
user.save(function(error) {
if (error) {
return res.json({
msg: "error"
});
} else {
callback(true);
}
});
}
exports.registerValidate = function(data, callback) {
var isValid = true;
var userData = [];
var errors = [];
for (var key in data) {
userData.push(data[key]);
}
var nam = Object.keys(data);
this.loginValidate(userData[0], function(data) {
//should wait for results
if (data) {
isValid = false;
}
});
util.validateMobile(userData[2], function(bool) {
if (!bool)
isValid = false;
});
if (util.validateEmail()) {
isValid = false;
}
//gets fired without waiting
callback(isValid);
}
这是另一种不理解回调和异步例程在 JavaScript 中如何工作的情况。函数不等待异步函数的完成。在继续之前,您可能希望阅读它。以下是一些相关问题:
- 如何从异步调用返回响应?
- 异步 Javascript 执行是如何发生的?以及何时不使用 return 语句?
- JavaScript 如何在后台处理 AJAX 响应?
为了解决您的特定问题,对 loginValidate
、validateMobile
和 callback
的异步调用必须链接到它们各自的回调函数中。以下是我的做法(请注意,这种方法是快速失败的,一旦我们知道用户无效,就不会触发更多的验证步骤):
exports.registerValidate = function(data, callback) {
var isValid = true;
var userData = [];
var errors = [];
for (var key in data) {
userData.push(data[key]);
}
var nam = Object.keys(data);
this.loginValidate(userData[0], function(data) {
if (data) {
callback(false);
return;
}
util.validateMobile(userData[2], function(bool) {
callback(bool && !util.validateEmail());
});
});
}