我正在通过POST方法验证表单。我想在已注册电子邮件地址时将错误输入express-validator,因此当我执行req.validationErrors()时,它会被包括在内。像这样:
req.checkBody('inputFirstName', 'First name empty').notEmpty();
req.checkBody('inputLastName', 'Last name empty').notEmpty();
db.User.find({email: req.body.inputEmail}, function (err, user){
if(user){
var error = {param: "inputEmail", msg: "Email address already registered", value: ''};
expressValidator._errors.push(error);
}
});
感谢。
答案 0 :(得分:5)
您可以这样做:
req.checkBody('inputFirstName', 'First name empty').notEmpty();
req.checkBody('inputLastName', 'Last name empty').notEmpty();
var errors = req.validationErrors();
db.User.find({email: req.body.inputEmail}, function (err, user){
if(user){
var error = {param: "inputEmail", msg: "Email address already registered", value: req.body.email};
if (!errors) {
errors = [];
}
errors.push(error);
}
// Here need to be next part of action - not outside find callback!
});
但我认为在请求方验证中加入一些mongoose验证是个坏主意。您可以使用一些架构方法,例如预存,在那里进行验证。
答案 1 :(得分:2)
以下是您应放入验证器的一个示例:
// Validates data when registering new user.
exports.registerNewUser = [
body('email').
exists().withMessage("Email is required").
isEmail().withMessage("Not a valid email").bail().
// bail() is important so that in case some of previous validations fail, you don't call db function
custom(async (val) => {
// Check if the email is already taken
try {
const user = await User.getOneUserByEmail({email: val});
// check for example if user exists or that it is not closed
if(user && user.status!=="closed") return false;
else return true;
} catch(error) {
// if there is an error, always return false
console.log(error);
return false;
}
}).withMessage("Email already taken")
]
您还应该导入:
const { body } = require('express-validator/check');
答案 2 :(得分:0)
以下:
在app.js中:
...
var session = require('express-session');
var passport = require('passport');
var flash = require('connect-flash');
var validator = require('express-validator');
...
var app = express();
require('./config/passport');
...
app.use(bodyParser.urlencoded({ extended: false }));
app.use(validator());
...
app.use(session({ secret: settings.session_key, resave: false, saveUninitialized: false }));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
在Router / index.js中:
router.get('/register', function (req, res, next) {
var messages = req.flash('error');
res.render('customers/register', {
messages: messages,
hasErrors: messages.length > 0
}
}
router.post('/register', passport.authenticate('local.register', {
successRedirect: '/customer/dasdboard',
failureRedirect: '/customer/register',
failureFlash: true //required
}));
在Views / customers / signup.hbs中:
{{#if hasErrors}}
<div class="alert alert-danger">
{{#each messages}}
<p>{{this}}</p>
{{/each}}
</div>
{{/if}}
在config / passport.js中:
passport.use('local.register', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true //required
}, function(req, email, password, done) {
req.checkBody('inputFirstName', 'First name empty').notEmpty();
req.checkBody('inputLastName', 'Last name empty').notEmpty();
req.checkBody('inputEmail', 'Invalid email').notEmpty().isEmail();
req.checkBody('password','Confirm password does not match.').equals(req.body.confirmpassword);
var errors = req.validationErrors();
if (errors) {
var messages = [];
errors.forEach(function(error){
messages.push(error.msg);
});
return done(null, false, req.flash('error', messages));
}
db.User.find({email: req.body.inputEmail}, function (err, user) {
if (err) {
return done(err);
}
if (user) {
return done(null, false, {message: 'Email address already registered!'});
}
//Save new data here
....
});
}));
为我的解决方案工作。
答案 3 :(得分:0)
看起来express-validator已经显示为自定义验证器的用例:
https://express-validator.github.io/docs/custom-validators-sanitizers.html
const { body } = require('express-validator/check');
app.post('/user', body('email').custom(value => {
return User.findUserByEmail(value).then(user => {
if (user) {
return Promise.reject('E-mail already in use');
}
});
}), (req, res) => {
// Handle the request
});
答案 4 :(得分:-1)
blank