猫鼬
免责声明:我是一个新手网络开发者。
我正在创建一个注册页面。有5个输入字段,其中3个(用户名,密码和电子邮件)要求它们通过各种形式的验证。这是代码:
router.post('/register', function (req, res, next) {
user.username = req.body.username;
user.profile.firstName = req.body.firstName;
user.profile.lastName = req.body.lastName;
user.password = req.body.password;
user.email = req.body.email;
User.findOne({email: req.body.email}, function(err, existingEmail) {
if(existingEmail) {
console.log(req.body.email + " is already in use")
} else {
User.findOne({username: req.body.username}, function(err, existingUsername) {
if(existingUsername) {
console.log(req.body.username + " is already in use");
} else {
user.validate({password: req.body.password}, function(err) {
if (err) {
console.log(String(err));
} else {
user.save(function(err, user) {
if (err) {
return next(err);
} else {
return res.redirect('/')
}
})
}
});
}
});
}
});
});
基本上它首先检查它是否是重复的电子邮件;如果是重复的电子邮件,它会在console.log中说明。如果它不是重复的电子邮件,则它会检查用户名....然后转到密码。
问题是它一次只能做到这一点;如果用户输入了错误的电子邮件和用户名,则只会说电子邮件不正确(不会说电子邮件和用户名都不正确)。
我怎样才能让它同时验证所有3个表格?
回答如下:您可以使用async并行运行它们,它还可以使您的代码更清晰,并处理该回调地狱:
var async = require('async');
async.parallel([
function validateEmail(callback) {
User.findOne({email: req.body.email}, function(err, existingEmail) {
if(existingEmail) {
callback('Email already exists');
} else {
callback();
}
}
},
function validateUsername(callback) {
User.findOne({username: req.body.username}, function(err, existingUsername) {
if(existingUsername) {
callback('Username already exists');
} else {
callback();
}
}
},
function validatePassword() {
user.validate({password: req.body.password}, function(err) {
if(err) {
callback(err);
} else {
callback();
}
}
}
], function(err) {
if(err) {
console.error(err);
return next(err);
} else {
user.save(function(err, user) {
if (err) {
return next(err);
} else {
return res.redirect('/');
}
});
}
}
);
这样,数组中的所有验证方法都将并行运行,当所有验证方法都完成后,将保存用户。
猫鼬
免责声明:我是一个新手网络开发者。
我正在创建一个注册页面。有5个输入字段,其中3个(用户名,密码和电子邮件)要求它们通过各种形式的验证。这是代码:
router.post('/register', function (req, res, next) {
user.username = req.body.username;
user.profile.firstName = req.body.firstName;
user.profile.lastName = req.body.lastName;
user.password = req.body.password;
user.email = req.body.email;
User.findOne({email: req.body.email}, function(err, existingEmail) {
if(existingEmail) {
console.log(req.body.email + " is already in use")
} else {
User.findOne({username: req.body.username}, function(err, existingUsername) {
if(existingUsername) {
console.log(req.body.username + " is already in use");
} else {
user.validate({password: req.body.password}, function(err) {
if (err) {
console.log(String(err));
} else {
user.save(function(err, user) {
if (err) {
return next(err);
} else {
return res.redirect('/')
}
})
}
});
}
});
}
});
});
基本上它首先检查它是否是重复的电子邮件;如果是重复的电子邮件,它会在console.log中说明。如果它不是重复的电子邮件,则它会检查用户名....然后转到密码。
问题是它一次只能做到这一点;如果用户输入了错误的电子邮件和用户名,则只会说电子邮件不正确(不会说电子邮件和用户名都不正确)。
我怎样才能让它同时验证所有3个表格?
回答如下:您可以使用async并行运行它们,它还可以使您的代码更清晰,并处理该回调地狱:
var async = require('async');
async.parallel([
function validateEmail(callback) {
User.findOne({email: req.body.email}, function(err, existingEmail) {
if(existingEmail) {
callback('Email already exists');
} else {
callback();
}
}
},
function validateUsername(callback) {
User.findOne({username: req.body.username}, function(err, existingUsername) {
if(existingUsername) {
callback('Username already exists');
} else {
callback();
}
}
},
function validatePassword() {
user.validate({password: req.body.password}, function(err) {
if(err) {
callback(err);
} else {
callback();
}
}
}
], function(err) {
if(err) {
console.error(err);
return next(err);
} else {
user.save(function(err, user) {
if (err) {
return next(err);
} else {
return res.redirect('/');
}
});
}
}
);
这样,数组中的所有验证方法都将并行运行,当所有验证方法都完成后,将保存用户。