Ошибка типа : next() не является функцией

#node.js #express #mongoose #error-handling

Вопрос:

Я пишу функцию промежуточного программного обеспечения, которая ищет ошибки проверки, и если ошибка обнаружена, выдает определенный вывод, иначе продолжается поток программы. У меня есть две функции с точным кодом, но они проверяют разные схемы.

Моя первая функция выполняется без каких-либо исключений. Однако, когда я пытаюсь выполнить вторую функцию, я получаю сообщение об ошибке в консоли.

 const validateCampground = (req, res, next) => {
  const { error } = campgroundSchema.validate(req.body);
  if (error) {
    const msg = error.details.map((el) => el.message).join(",");
    throw new ExpressError(msg, 400);
  } else {
    next();
  }
};

const validateReview = (req, res, next) => {
  const { error } = reviewSchema.validate(req.body);
  if (error) {
    const msg = error.details.map((el) => el.message).join(",");
    throw new ExpressError(msg, 400);
  } else {
    next(); //this is the point where the exception occurs
  }
};
 

Только внутри функции validateReview функция следующего промежуточного программного обеспечения не распознается как допустимая функция.

Журнал ошибок консоли

Ответ №1:

Проблема заключалась не в следующем() промежуточном программном обеспечении, а в маршруте, поскольку я обертывал маршрут с помощью функции validateReview.

Я делал что-то вроде этого :

 app.post(
  "/campgrounds/:id/reviews",
  validateReview(
  catchAsync(async (req, res) => {
    //my Logic here
  })
));
 

В то время как я должен был сделать что-то подобное :

 app.post(
  "/campgrounds/:id/reviews",
  validateReview,
  catchAsync(async (req, res) => {
    //my logic here
  })
);
 

Ответ №2:

привет, если вы хотите использовать промежуточное программное обеспечение

 exports.middileware = (req,res,next)=>{

        try{

            //middileware logic

        next();

        }catch(err){

            //print the error
        })
        }
        
}
 

и вызовите экспортированный файл middileware в поле требуется файл, чтобы проверить функцию middileware

 const { middileware } = require('path');
 

и используйте вот так

 router.get('/routename',middleware,nextfunction)  //router you can choose as you like get,post,patch anything
 

попробуйте это