Как устранить ошибку промежуточного программного обеспечения Validator Express? - PullRequest
1 голос
/ 06 января 2020

Во-первых, у меня есть userController, например:

Файл userController. js

const { validationResults } = require('express-validator');
const { userSignUpValidation } = require('../validator/userSignUpValidate');


function userCreation(req, res) {
    try{
        const errors = validationResults(req);
        if(errors) {
            return res.status(400)
            .json({
                error: {
                    message: errors.array()[0].msg
                }
            })
        }

        bcrypt.hash(req.body.userPassword, saltRounds, function(err, hash) {
            User.create({
                userId: req.body.userId,
                userEmail: req.body.userEmail,
                userPhoneNumber: req.body.userPhoneNumber,
                userPassword: hash
            })
            .then((user) => {
                return res.status(200).json(user);
            })
            .catch((error) => {
                return res.status(400).json.error;
            });
        });
    } catch(error) {
        return res.status(400)
        .json({
            error: {
                message: error
            }
        })
    }
}

В validator / userSignUpValidate. js код, подобный следующему:

'use strict'

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

module.exports = [
    check('userId').isLength({ min: 5 }).withMessage('The username at least more than 5 characters!'),
    check('userPassword').isLength({ min: 6 }).withMessage('The password at least more than 6 characters!'),
    check('userPhoneNumber').isLength({ min: 10 }).withMessage('The phone number at least more than 10 characters!'),
    check('userEmail').isEmail().withMessage('Is your email correct? Please be correct!')
]

Когда я проверяю его на почтальоне, ответ json всегда показывает ошибку catch на userController. js без сообщения об ошибке.

{
    "error": {
        "message": {}
    }
}


Мой вопрос. Чтобы убедиться, что express -validator работает в нужном месте, куда я должен поместить код?

Ответы [ 4 ]

1 голос
/ 06 января 2020

Во-первых, вам нужно импортировать validationResult из express-validator, в свой код вы импортируете validationResults.

Во-вторых, вы не используете промежуточное ПО userSignUpValidate. Это промежуточное ПО можно использовать в контроллере, но лучше использовать его в userRoute, чтобы поддерживать контроллер в чистоте.

Так что давайте применим userSignUpValidate промежуточное ПО для userRoutes. Если пути к файлам не совпадают с вашими, исправьте их.

const express = require("express");
const router = express.Router();
const usersController = require("../controllers/userController");
const userSignUpValidate = require("../validator/userSignUpValidate");

router.post("/register", [userSignUpValidate], usersController.userCreation);

module.exports = router;

Затем в контроллере нам нужно импортировать validationResult из express-validator и использовать его:

const { validationResult } = require("express-validator");

function userCreation(req, res) {
  try {
    const errors = validationResult(req);
    if(!errors.isEmpty()) {
      console.log(errors);
      return res.status(400).json({
        error: {
          message: errors.array()[0].msg
        }
      });
    }

    //other code you have
  } catch (error) {
    return res.status(400).json({
      error: {
        message: error
      }
    });
  }
}

exports.userCreation = userCreation;

Когда мы отправляем тело запроса с трехсимвольным паролем, как это:

{
  "userId": "userid",
  "userPassword": "123",
  "userPhoneNumber": "1234567890",
  "userEmail": "abc@gmail.com"
}

Ответ будет таким с 400 - Плохой запрос:

{
    "error": {
        "message": "The password at least more than 6 characters!"
    }
}
0 голосов
/ 06 января 2020
 const Joi = require('@hapi/joi');                                           
 const loginValidation = data =>{    const schema = {
    username: Joi.string().min(5).required(),
    password: Joi.string().min(5).required(),
    deviceId: Joi.string().min(2).required()
};
return Joi.validate(data, schema); };                   
module.exports.loginValidation = loginValidation;                                 

Файл моих маршрутов

const { registerValidation, loginValidation } = require('../../validation');   router.post('/login', async (req, res)=>{
try {
    //validate the data to be submitted
    const { error } = loginValidation(req.body);
    if (error) return res.status(200).send(
        {
            status: 0,
            message: "Validarion Error",
            details: error.details[0].message
        });

} catch (error) {
    res.status(400).send({
        status: 0,
        message: "Failed",
        error: error
    });
}});

этот код работает нормально и находится в рабочем режиме

0 голосов
/ 06 января 2020

Просто попробуйте, как показано ниже,

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


const app = express();

//this function you need to export in controller
const xxx = (req, res, next) => {
  try {
    validationResult(req).throw();
    res.status(200).send('success');
  } catch (err) {
    console.log('error messagecame')
    res.status(422).json(err);
  }
}

app.get('/', oneOf([
  check('lang').isIn(['js', 'react', 'angular'])
]), xxx);

app.listen(4000, ()=>{
  console.log("running server 4k")
})

Пример рабочей копии

ОБНОВЛЕНИЕ 2

Надеюсь, что ниже один поможет полностью,

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

const app = express();
const xxx = [
  check('lang').isIn(['js', 'react', 'angular']),
  (req, res, next) => {
    try {
      validationResult(req).throw();
      res.status(200).send('success');
    } catch (err) {
      console.log('error messagecame')
      res.status(422).json(err);
    }
  }
]

app.get('/', xxx);

app.listen(4000, ()=>{
  console.log("running server 4k")
})

ОБРАЗЕЦ РАБОЧЕЙ КОПИИ2

Ошибка

https://TruthfulWeirdIrc--five-nine.repl.co?lang=jssddf

Успех

https://TruthfulWeirdIrc--five-nine.repl.co?lang=js

0 голосов
/ 06 января 2020

ты должен пройти вот так

const errors = validationResults(req.body);

...