使用expressjs

时间:2016-09-20 13:21:25

标签: node.js forms express

我实际上在一个学校项目上工作,我必须做一个带有微框架的约会网站。 我选择使用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'中找到这个部分)

感谢您的帮助。

1 个答案:

答案 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和生成器可以创建更优雅的解决方案。