Node.js Push方法不起作用,它只显示空数组

Node.js Push方法不起作用,它只显示空数组,node.js,express,mongoose,Node.js,Express,Mongoose,我通过在数组中推送错误消息来动态添加错误,但当我在函数中调用它时,它不会执行任何操作 router.post('/Registration',function(req,res){ var path = '/auth/Registration'; req.assert('username', 'Username is required').notEmpty(); req.assert('email', 'valid email required').notEmpty().isEmail(); re

我通过在数组中推送错误消息来动态添加错误,但当我在函数中调用它时,它不会执行任何操作

router.post('/Registration',function(req,res){
var path = '/auth/Registration';
req.assert('username', 'Username is required').notEmpty();
req.assert('email', 'valid email required').notEmpty().isEmail();
req.assert('password', 'password is required').notEmpty();
req.assert('cpassword', 'password is required').notEmpty();
req.assert('phoneNumber', 'phone Number is required').isNumeric();
req.assert('age', 'age is required').notEmpty().isInt();
req.assert('designation', 'designation is required').notEmpty().isInt();
req.assert('timing', 'timing is required').notEmpty().notEmpty().isInt();
req.assert('sex', 'sex is required').notEmpty();
req.assert('joiningDate', 'joiningDate is required').notEmpty();
var errors = req.validationErrors();
if(errors) {
    req.session.error = errors;
    return  res.redirect('/auth/Registration');
}
var errorsArr = [];
User.findOne({"username":req.body.username},function(err,user){
    if(user){
        errorsArr.push({"msg":"Username already been taken."});
    }
    User.findOne({"email":req.body.email},function(err1,user1){
        if(user1) {
            errorsArr.push({"msg":"Email already been taken."});
        }
        if(errorsArr.length > 0)
        {
            req.session.error = errorsArr;
            return  res.redirect('/auth/Registration');
        }

    });

});
var newUser = new User();
newUser.username = req.body.username;
newUser.password = req.body.password;
newUser.sex = req.body.sex;
newUser.email = req.body.email;
newUser.phoneNumber = req.body.phoneNumber;
newUser.age = req.body.age;
newUser.designation = req.body.designation;
newUser.timing = req.body.timing;
var CurrentDate = moment.tz(new Date(req.body.joiningDate),"Asia/Karachi").unix();
newUser.joiningDate = CurrentDate;
newUser.save(function(err,user){
    if(!err)
        return res.redirect('/auth/Login');
});
});

当我控制台
errorArray
时,它会显示一个空数组。

您可以通过使用promise$q或简单嵌套或回调来解决此问题

简单嵌套代码:

var errorsArr = [];
User.findOne({"username":req.body.username},function(err,user){
    // you should check err
    if(user){
        errorsArr.push({"msg":"Username already been taken."});
    }

    User.findOne({"email":req.body.email},function(err1,user1){
        // you should check err1
        if(user1) {
            errorsArr.push({"msg":"Email already been taken."});
        }

        console.log(errorsArr);

        if(errorsArr.length > 0)
        {
           req.session.error = errorsArr;
           return  res.redirect('/auth/Registration');
        }

    });

});

看起来findOne函数正在执行一些数据库查询。我是这样假设的。如果是这样,那么它会返回一个承诺,而你不能这样处理它。 试试这个


代码是异步执行的,因此“如果(errorsArr.length>0)”在检查用户名和电子邮件时,在不等待回调的情况下进行评估。是的,那么我应该做什么来检查这种情况?你能给我举个例子吗?可能是今天第30次出现关于不正确使用异步操作的类似问题。那么,你能给我举个正确使用异步操作的链接或例子吗? 这对我们有好处,它会显示一个错误“\u http\u outgoing.js:335抛出新错误('发送后无法设置标题');^error:发送后无法设置标题”它仍然显示一个错误我已更新了注册的问题完整功能。请查看。谢谢我必须安装promise?不,您不需要。用户应该是您要查找的值。请在此处查看
User.findOne({"username":req.body.username}).then(function(user){
   if(user){
      errorsArr.push({"msg":"Username already been taken."});
   }
}, function(err){

})