在Node.js中的单独文件中进行Express-validation

问题描述

我在一个单独的文件添加一个通用验证器,并希望重用它们

错误下方的auth.js中的

错误

Route.post()需要回调函数,但是得到了[object Undefined]

auth.js路由

 const express = require('express');
 const { commonValidation } = require('../validation/commonValidation');
 
 const { validation } = require('../middleware/validation');
 
 const {
   register,} = require('../controllers/auth');

 const router = express.Router();
 
 //============ WANT TO RESUSE register validator for profile

 router.post('/register',[commonValidation('register'),validation],register);

 module.exports = router;

auth.js控制器

 const ErrorResponse = require('../utils/errorResponse');
 const asyncHandler = require('../middleware/async');
 const User = require('../models/User');


 exports.register = asyncHandler(async (req,res,next) => {
 const { email,password } = req.body;

 let user = await User.findOne({ email });

 if (user) {
   return next(new ErrorResponse('Email already exists',500));
 }

 user = new User({

  email,password,});

  await user.save();

  sendTokenResponse(user,200,res);
  });

commonValidation

   const { check } = require('express-validator');
   exports.commonValidation = (method) => {
   switch (method) {

    case 'userUpdate':
    case 'register': {
    return [
    check('email','Please include a valid 
    email').isEmail().trim().escape(),check(
      'password',`Please enter a password with 6 or more 
        characters`
    ).isLength({ min: constants.passwordLength }).trim().escape(),]
 }
 }
 }

validation.js

const { validationResult } = require('express-validator');
const asyncHandler = require('./async');


exports.exports = asyncHandler(async (req,next) => {


const errors = validationResult(req);

if (!errors.isEmpty()) {

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

}

 return next(new ErrorResponse(extractedErrors,401));

 });

asyncHandler

 const asyncHandler = fn => (req,next) =>
 Promise.resolve(fn(req,next)).catch(next);

 module.exports = asyncHandler;

errorResponse.js

class ErrorResponse extends Error {
constructor(message,statusCode) {
super(message);
this.statusCode = statusCode;

Error.captureStackTrace(this,this.constructor);
 }
}   

module.exports = ErrorResponse;

error.js

     const ErrorResponse = require('../utils/errorResponse');
     const { validationResult } = require('express-validator');

  const errorHandler = (err,req,next) => {
  let error = { ...err };

  error.message = err.message;

  // Log to console for dev
   console.log(err);

 // Mongoose bad ObjectId
  if (err.name === 'CastError') {
   const message = `Resource not found`;
   error = new ErrorResponse(message,404);
  }

 // Mongoose duplicate key
 if (err.code === 11000) {
  const message = 'Duplicate field value entered';
  error = new ErrorResponse(message,400);
 }

 // Mongoose validation error
 if (err.name === 'ValidationError') {

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

  // // if (!errors.isEmpty()) {
  // //    return apiResponse.validationErrorWithData(res,"Validation 
  Error.",extractedErrors);
  // // }


  const message = Object.values(err.errors).map(val => val.message);
   error = new ErrorResponse(message,400);
  }

   res.status(error.statusCode || 500).json({
   success: false,error: error.message || 'Server Error'
    });
  };

  module.exports = errorHandler;

server.js

const errorHandler = require('./middleware/error');
// Mount routers
app.use('/api/v1/auth',auth);
app.use('/api/v1/users',users);

app.use(errorHandler);

我想从快速验证器获取错误。但这会带来错误

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)