如何使用express-validator抛出自定义错误?

时间:2013-11-23 21:33:55

标签: node.js express validation

我正在通过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);
        }
    });

感谢。

5 个答案:

答案 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
相关问题