Express和节点向车把视图发送错误消息
如何将验证错误输出到电子邮件unique: true
选项的视图?在我的车把视图中,我正在从errors
传递var errors = req.validationErrors();
并在正在工作的视图中显示它。但唯一性的电子邮件验证将发送到user.save((err)
,并且只是被发送到控制台。验证工作正常,如果有重复的电子邮件,则不会创建用户。我只是想将错误消息发送到视图。我可以为req.check
做unique: true
吗?
const UserSchema = new Schema({
email: { type: String, index: { unique: true } },
password: { type: String, required: true }
});
我的createUser.handlebars视图
{{#if errors}}
<section class="errors">
<ul>
{{#each errors}}
<li>{{this.msg}}</li>
{{/each}}
</ul>
</section>
{{/if}}
createUser函数
module.exports.createUser =
(req, res, next) => {
let user = new User({
email: req.body.email,
password: req.body.password
});
req.check('email', 'Invalid email').isEmail();
req.check('password', "Passwords must match").isLength({min: 6}).equals(req.body.passwordConfirmation);
var errors = req.validationErrors(); // save any error messages
// check if there are any errors
if (errors) {
req.session.errors = errors;
req.session.success = false;
return res.redirect('/users/new');
} else {
req.session.success = true;
}
// save the user
user.save((err) => {
if (err) {
console.log("Error : %s ", err);
}
// set the session messages back to null and redirect
req.session.success = null;
req.session.errors = null;
res.redirect('/');
});
};
回答如下:
如果我没错,你使用express-validator进行验证。问题是你要混合两件事:表单验证和数据库约束。
唯一性不是数据项的固有属性,也不能独立于整个集进行检查。
您只能使用对数据库的调用来检查唯一性。如果您的数据库模式将此属性/列定义为唯一,那么尝试存储它将引发错误(至少在基于SQL的数据库和MongoDB中)。