Как я могу решить TypeError: express -validator не является функцией - PullRequest
0 голосов
/ 23 апреля 2020

Я использую express -validator версии 6.4.0. Я получаю эту ошибку при запуске сервера. Я пытался использовать пользовательскую проверку и создал отдельные файлы для валидатора, контроллера и маршрутов.

Вот файл основного сервера "index. js"

const express = require('express');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const {expressValidator} = require('express-validator');
const db = require('./models');

const app = express();

db.sequelize.sync({force: true}).then(() => { console.log("Connected to DB") }).catch((err) => {console.log(err)});

app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.use(cookieParser());

app.use(expressValidator());

require('./routes/user.routes')(app);

Мой валидатор В файле есть две функции: одна для проверки правильности, а другая для возврата ответа на основе проверки "user.validator. js"

const { check, validationResult } = require('express-validator');

const checkValidation = (method) => {
    switch (method) {
        case "create": {
            return [
                check("first_name").exists().withMessage("It is mandatory to enter your first name"),
                check("last_name").exists().withMessage("It is mandatory to enter your last name"),
                check("email").exists().withMessage("It is mandatory to enter email")
                .isEmail().withMessage("The email must be in correct format as foo@bar.com"),
                check("password").exists().withMessage("It is mandatory to enter password")
                .isLength({ min: 6 }).withMessage("Password must be at least 6 characters in length"),
                check("role").exists().withMessage("It is mandatory to enter role")
                .isInt().withMessage("Role must be a number")
            ];
        }
    }
}

const validate = (req, res, next) => {
    const errors = validationResult(req);

    if (errors.isEmpty()) {
        return next();
    }

    const extractedErrors = [];
    errors.array().map(err => extractedErrors.push({ [err.param]: err.msg }))

    return res.status(422).json({
        errors: extractedErrors,
    });
}

module.exports = {
    checkValidation,
    validate,
};

Вот моя единственная функция в user.controller. js

exports.create = (req, res, next) => {
    try {
        console.log(req.body);
        return res.json(req.body);
    } catch (error) {
        return next(error);
    }
}

Это файл маршрутов "user.routes. js"

module.exports = app => {
    const user = require('../controllers/user.controller');
    const {checkValidation, validate } = require('../validators/user.validate');
    let router = require('express').Router();

    //route to create a new tutorial
    router.post('/', checkValidation('create'), validate(), user.create);

    app.use('/api/users', router);
}

1 Ответ

2 голосов
/ 23 апреля 2020

В версии 6 вам не нужно использовать app.use (expressValidator ()); просто используйте утилиты express -validator в промежуточном программном обеспечении, здесь вы можете увидеть некоторую реализацию в вопросе github:

Вот моя реализация. Удалить:

app.use(expressValidator())

Затем:

var router = express.Router();
const { check, validationResult } = require('express-validator');

router.post('/register',
  [
    check('email', 'Email is not valid').isEmail(),
    check('username', 'Username field is required').not().isEmpty(),
    check('password', 'Password field is required').not().isEmpty())
  ], 
  function(req, res, next) {

  // Check Errors
  const errors = validationResult(req);
  if (errors) {
    console.log(errors);
    res.render('register', { errors: errors.array() });
  }
  else {
    console.log('No Errors');
    res.render('dashboard', { message: 'Successful Registration.' });
  }
});
...