Express 4 - Пользовательское промежуточное ПО для обработки ошибок не вызывается - PullRequest
0 голосов
/ 01 апреля 2020

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

Документы: https://expressjs.com/en/guide/error-handling.html

Практически все подобные проблемы, которые я обнаружил здесь и на GitHub, были решены путем размещения промежуточного программного обеспечения для обработки ошибок и самого конца стека ... но я уже сделал это, и до сих пор не повезло.

Вот мой код:

// сервер. js

import express from 'express';
import body from 'body-parser';
import cookies from 'cookie-parser';
import {
    provideLogger,
    responseStructure,
    errorHandler, // => confirmed is importing the right function
} from '@middleware';
import routes from '@routes';
import { Logger } from '@utils';
import config from '@config';

const logger = new Logger().context('startup');

async function onAppReady(...args) {
    logger.success(`API listening on port ${config.port}`);
}

express()
    .use(body.json())
    .use(cookies())
    .use(provideLogger)
    .use(responseStructure)
    .use(routes)
    .use(errorHandler) // => applied after routes
    .listen(config.port, onAppReady);

// маршруты. js

import { Router } from 'express';
import myRoute from './myRoute';

const router = new Router();

router.use('/route', myRoute);


export default router;

// myRoute . js

import { Router } from 'express';
import endpoint from './endpoint';

const myRoute = new Router();

myRoute.post('/:objectId/', endpoint);


export default myRoute;

// конечная точка

export default function endpoint(req, res, next) {
  console.log('I am an endpoint, time to trigger an error');
  next({ status: 404, message: 'Success not found :(' });
}

// middleware

export function errorHandler(
  {
    error = {},
    message = 'An error occurred.',
    status = 500,
  } = {},
  req,
  res,
  next,
) {
  console.log('I am handling the error');
  res.status(status).send({ error: true });
}

Когда я отправляю запрос конечной точке, он печатает журнал из моей конечной точки затем возвращает файл HTML с данными, которые я передал в next как тело HTML. Журнал от моего errorHandler никогда не печатается.

Я полил документы, и из того, что я могу сказать, я все делаю правильно. Я должен что-то упустить, но что ?? Почему мой обработчик ошибок никогда не вызывается ??

1 Ответ

0 голосов
/ 02 апреля 2020

Похоже, что проблема была в том, как я устанавливал значение по умолчанию для первого аргумента в обработчике ошибок.

Изменение с

export function errorHandler(
  {
    error = {},
    message = 'An error occurred.',
    status = 500,
  } = {},
  ...

на

export function errorHandler(
  {
    error = {},
    message = 'An error occurred.',
    status = 500,
  },
  ...

исправил это.

...