繁体   English   中英

如何使用Express.js进行正确的JSON发布验证?

[英]How to do proper JSON post validation using Express.js?

我正在尝试使用Express.JS时实现雄辩而干燥的正确后验证。 正确执行此操作的最佳方法是什么?

这是一段代码片段,我在其中尝试确保此POST路由不会使Node.js服务器崩溃并且类型安全。 但是我觉得这是实现这一目标的丑陋方式:

app.post('/signup', function(req, res) {
if(typeof req.body.name !== 'string' || typeof req.body.email !== 'string'  || typeof req.body.password !== 'string' ){
    res.status(400).send({status:400, message: 'Invalid json post format', type:'client'}); 
}else{  
    User.findOne({
        name: req.body.name
    }, function(err, user) {
        if (err) throw err;

        if (!user) {
            User.findOne({
                email: req.body.email
            }, function(err, user) {

                if (err) throw err;

                if (!user) {
                    //both username and email are neither in use so lets create a user
                    var passwordToSave = bcrypt.hashSync(req.body.password, salt);

                    var user = new User({ 
                        name: req.body.name,
                        email: req.body.email,
                        password: passwordToSave,
                        admin: false 
                    });
                    user.save(function(err) {
                        if (err) throw err;

                        console.log('User created successfully');
                        res.json({ success: true });
                    });

                } else if (user) {
                    res.json({ success: false, message: 'Signup failed. Username already in use.' });
                }

            });         
        } else if (user) {
            res.json({ success: false, message: 'Signup failed. Username already in use.' });
        }
    });
}});

Json模式标准(以及实现它的各种库中的任何一种)是一种很好的DRY方法。 可以在客户端和服务器端进行相同的验证。 更重要的是,您甚至可以使用jdorn的Json表单库从架构自动生成必需的html表单!

我强烈建议使用Joi作为您的验证工具

超级简单,易于适应

在您的方案中,您需要的是

const schema = Joi.object().keys({
  name: Joi.string(),
  email: Joi.string(),
  password: Joi.string()
})

Joi.validate(req.body, schema);

你也可以使用更严格的规则来验证您的输入,例如.email() .min() .mex()等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM