回调在没有等待节点 js 的情况下被触发



嗨,我是节点新手,我正在尝试创建注册功能...它检查用户名是否存在以及其他一些验证..但它不是等待从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 响应?

为了解决您的特定问题,对 loginValidatevalidateMobilecallback 的异步调用必须链接到它们各自的回调函数中。以下是我的做法(请注意,这种方法是快速失败的,一旦我们知道用户无效,就不会触发更多的验证步骤):

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

相关内容

最新更新