Express.js + Sequelize +表单验证

时间:2015-11-30 12:06:51

标签: javascript forms validation express sequelize.js

我正在使用我的第一个Express + Sequelize应用程序,并希望使用Sequelize的验证机制来验证提交的表单,而无需重新实现前端的所有验证(或使用其他验证库,如快递验证员等)。所以,基本上我想做类似以下的事情:

var signup = function(req, res) {
    res.render('signup', { title: 'Sign-up' });
}

router.get('/signup', signup);

router.post('/signup', function(req, res) {
    User.create({
        email: req.body.email,
        ...
    }).then(function(user) {
        req.flash('info', 'User created successfully.');
        res.redirect('/login');
    }).catch(function(err) {
        // [1] Bring sequelize's error messages into a suitable form somehow
        if (req.xhr) {
            res.json(err);
        }
        else {
            // [2] Fallback for non-JS browsers
            req.flash('error', err);
            signup(req, res);
        }
    });
});
  1. 在没有手动按摩Sequelize错误消息到JSON对象的情况下,解决[1]的好方法是什么?
  2. 如何处理前端的JSON,将字段标记为包含错误而不为每个字段手动执行此操作?
  3. 使用发布的数据重新填充表单的建议方法是什么?我已经在网上搜索过高低,但很难找到任何有关此信息的信息,而且每个人似乎只是在模板中手动设置值属性(在处理检查时会变得单调乏味 - / radio- / combo boxes)。我知道通过AJAX提交表单时这不是问题,但表单应该始终也可以在没有javascript的情况下工作。
  4. 非常感谢!

1 个答案:

答案 0 :(得分:0)

我建议您将验证逻辑与“数据库”逻辑分开。它允许您更明确地显示验证错误并降低复杂程度。

将所有逻辑移至单独的文件 router.post('/signup' create)

    create(req, res, next){

        createForm.validate(req)
            .then(()=>{
                return createForm.create(req);
            })
            .then((createdUser) => {
                req.flash('info', 'User created successfully.');
                res.redirect('/login');
            })
            .catch((error)=> {

                if(error instanceof ValidationError) {
                    req.flash('error', error);
                    return signup(req, res);
                }
                next(error); //go to handle of unexpected  error
            });
    }