[英]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.