我实际上在一个学校项目上工作,我必须做一个带有微框架的约会网站。 我选择使用ExpressJS来学习NodeJS,但我在异步方面遇到了一些困难...... 我尝试制作个人资料更新表格,您必须在旧表格中输入旧密码才能更新您的电子邮件地址或密码。但是使用异步我不知道如何验证表单。
我们不能使用ORM,验证器或用户管理器(如护照)。
这是我试过的
表格的第一条路线
router.get('/profile', isConnected, (request, response) => {
response.render('profile.ejs');
});
验证表单的第二条路线
router.post('/changeCredentials', isConnected, (request, response) => {
var user = User.formJSON(request.session.user);
if (User.hashPassword(request.body.old_password, user.salt) === user.password)
{
if (request.body.email !== undefined && request.body.email !== user.email)
{
request.formValidate('email', 'Email not valid').isNotEmpty().isEmail();
request.formValidate('email', 'Email already used').isUnique(User, () => {
if (request.formIsValid)
{
user.email = request.body.email;
request.user.connect(user);
console.log(request.session);
User.update(user, () => {
request.flash('success', 'Email updated');
});
}
});
}
if (request.body.new_password !== undefined && request.body.new_password !== '')
{
request.formValidate('new_password', 'Password is not valid.').isNotEmpty().isLength(6, 255).isGoodPassword();
request.formValidate('new_password', 'Password does not match').isEqualTo(request.body.new_password_conf);
if (request.formIsValid)
{
user.password = request.body.new_password;
User.update(user, () => {
request.flash('success', 'Password changed!');
}, true);
}
}
}
else
{
request.flash('error', 'Bad Old password');
}
response.redirect('/u/profile');
});
Full code here(你可以在'routes / user.js'中找到这个部分)
感谢您的帮助。
答案 0 :(得分:0)
这是异步回调的常见问题。您需要在每个可能的路径中都有响应,因为catch-all重定向忽略了异步调用。
router.post('/changeCredentials', isConnected, (request, response) => {
var user = User.formJSON(request.session.user);
if (User.hashPassword(request.body.old_password, user.salt) === user.password)
{
if (request.body.email !== undefined && request.body.email !== user.email)
{
request.formValidate('email', 'Email not valid').isNotEmpty().isEmail();
request.formValidate('email', 'Email already used').isUnique(User, () => {
if (request.formIsValid)
{
user.email = request.body.email;
request.user.connect(user);
console.log(request.session);
User.update(user, () => {
request.flash('success', 'Email updated');
response.redirect('/u/profile');
});
return;
}
response.redirect('/u/profile');
});
return;
}
if (request.body.new_password !== undefined && request.body.new_password !== '')
{
request.formValidate('new_password', 'Password is not valid.').isNotEmpty().isLength(6, 255).isGoodPassword();
request.formValidate('new_password', 'Password does not match').isEqualTo(request.body.new_password_conf);
if (request.formIsValid)
{
user.password = request.body.new_password;
User.update(user, () => {
request.flash('success', 'Password changed!');
response.redirect('/u/profile');
}, true);
return;
}
}
} else {
request.flash('error', 'Bad Old password');
}
response.redirect('/u/profile');
});
上面的代码显示了一种回调式方法。使用Promises和生成器可以创建更优雅的解决方案。