Пользовательский обработчик ошибок в express.js не вызывается - PullRequest
2 голосов
/ 06 апреля 2019

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

Обратите внимание, что это напечатано на машинке и использует mongodb, если это имеет значение (не думаю, что это должно). Вот соответствующий код:

index.ts:

import routes from './routes/index.ts';
import express, { Request, Response, NextFunction } from 'express';
// other imports...

type ServerErrror = {
    status: number;
    message: string;
}

const app = express();

// set up logging...

app.use(bodyParser.json());
app.use('/', routes);
app.use((err: ServerError, req: Request, res: Response, next: NextFunction) => { // eslint-disable-line no-unused-vars
    console.error('in error handler');
    res.status(err.status).send(`got error: ${err.message}`);
});

mongoose.connect(MONGODB_URI)
    .then(() => {
        console.log('Successfully connected to database.');
        app.listen(SERVER_PORT, () => {
            console.log(`Server is up and running on port ${SERVER_PORT}`);
        }).on('error', error => {
            console.log('Error starting server:', error);
        });
    }, error => {
        console.log('Error connecting to database:', error);
    });

перенаправляет / index.ts:

import { Router } from 'express';
import dataRoutes from './data.ts';

const router = Router();

router.use('/data', dataRoutes);

export default router;

маршруты / data.ts:

import { Router } from 'express';
import Data from './models/Data';

const router = Router();

router.get('/', (_, res, next) => {
    Data.find((error, data) => {
        if (error) {
            console.log('found an error')
            next({ status: 500, message: 'got an error' });
            return;
        }
        res.send(`Got data: ${JSON.stringify(data.map(datum => datum.toJSON()))}`);
    });
});

export default router;

Когда я запускаю сервер и затем отправляю запрос GET конечной точке / data с помощью почтальона, это вывод на сервере:

Successfully connected to database.
Server is up and running on port 1234
found an error
GET /data 500 35.289 ms - 142 // this is from morgan logging
[object Object] // no idea where this is coming from, i assume express default error handler

И это возвращаемое значение, которое я вижу в почтальоне:

<code><!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Error</title>
    </head>
    <body>
        <pre>[object Object]

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

Ответы [ 2 ]

2 голосов
/ 06 апреля 2019

Оказывается, проблема была в том, что я использовал babel-preset-minify , который, по-видимому, неправильно преобразовал код.Избавление от этой предустановки заставило код работать без других модификаций.

2 голосов
/ 06 апреля 2019

Есть некоторые проблемы с вашим кодом:

  • import routes from './routes/index.ts' не должно иметь расширение *.ts.
  • import dataRoutes from './data.ts'; не должно иметь расширение *.ts.
  • ServerErrror имеет слишком много букв.

Вот краткий пример, который работает на моей машине. Я удалил код, связанный с Mongoose, и изменил пример, чтобы его можно было легко воспроизвести в одном файле. Вызов http://localhost:5000/data возвращает customErrorHandler > dataRoutes.get > Error, что, я думаю, вам нужно.

import { Request, Response, NextFunction } from 'express';
import bodyParser = require('body-parser');
import express = require('express');

type ServerError = {
  status: number;
  message: string;
}

const dataRoutes = express.Router().get('/', (_, res, next) => {
  setTimeout(() => { // mimic an asynchronous operation
    const error = true;
    if (error) {
      next({ status: 500, message: 'dataRoutes.get > Error' });
      return;
    }

    res.send('dataRoutes.get > Success');
  }, 1000);
});

const routes = express.Router().use('/data', dataRoutes);

const app = express();
app.use(bodyParser.json());
app.use('/', routes);
app.use((err: ServerError, req: Request, res: Response, next: NextFunction) => {
  res
    .status(err.status)
    .send(`customErrorHandler > ${err.message}`);
});

app.listen(5000);
console.log('Now listening on port 5000');

Это мой файл tsconfig.json:

{
  "compilerOptions": {
    "moduleResolution": "node",
    "module": "commonjs",
    "allowSyntheticDefaultImports": true
  }
}

Это мои зависимости package.json:

"devDependencies": {
  "@types/express": "^4.16.1",
  "typescript": "^3.4.1"
},
"dependencies": {
  "express": "^4.16.4"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...