Почему моя ошибка не обрабатывается в express. js? - PullRequest
1 голос
/ 28 марта 2020

Я изучаю express. js, и я думаю, почему я получаю UnhandledPromiseRejectionWarning, и после выполнения вызова HTTP API не отправляется ответ об ошибке.

Для обработки ошибок я создал вспомогательный класс и промежуточное ПО:

/helpers/errorHander.js
------------------------------------
class ErrorHandler extends Error {
  constructor(statusCode, message) {
    super();
    this.statusCode = statusCode;
    this.message = message;
  }
}

const handleError = (err, res) => {
  const { statusCode, message } = err;
  res.status(statusCode).json({
    status: 'error',
    statusCode,
    message
  });
};

module.exports = {
  ErrorHandler,
  handleError
};

Я включил это промежуточное ПО в приложении. js file:

/app.js
------------------------------------
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const config = require('./config/init');
const cors = require('cors');
const { handleError, ErrorHandler } = require('./helpers/errorHandler');

//routes
const apiRoutes = require('./api');

// connect db
config.initializeDB();

// configure bodyParser
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

// Enable Cors
app.use(cors());

// Set Routes
app.use('/', apiRoutes);

app.get('/error', (req, res) => {
  throw new ErrorHandler(500, 'Internal server error');
});

// Enable error handling middleware
app.use((err, req, res, next) => {
  handleError(err, res);
});

module.exports = app;

Когда я выполняю запрос к конечной точке / error, она работает правильно: / error endpoint Но при выполнении запроса к конечной точке, которая выполняет операции с mon goose, я не получаю желаемого результата: / v1 / users / endpoint

user.route . js:

const router = require('express').Router();
const userController = require('./user.controller');

router.get('/', userController.getUsers);
router.post('/', userController.createUser);

module.exports = router;

user.controller. js:

const userService = require('../../../services/user');

module.exports = {
  getUsers: (req, res, next) => {
    return res.json(userService.getUsers());
  },
  createUser: (req, res, next) => {
    const username = req.body.username;
    const password = req.body.password;
    res.json(userService.createUser(username, password));
  }
};

user.service. js:

const User = require('../models/user');
const { ErrorHandler } = require('../helpers/errorHandler');

module.exports = {
  getUsers: async () => {
    return User.find({});
  },
  createUser: async (username, password) => {
    const user = new User({ username, password });
    try {
      await user.save();
      return user;
    } catch (err) {
      if (err.code === 11000) {
        throw new ErrorHandler(409, 'Username already exists!');
      }
      throw new ErrorHandler(500, 'Internal server error');
    }
  }
};

Консоль дает такое предупреждение: Консольный вывод

Почему он не работает так, как я хочу, и как я могу заставить его работать?

========= ======================================================= Обновление # 1 Как предположил пользователь - jfriend00, я попытался дождаться обещания, и вот мой код Окс вроде на user.controller. js:

const userService = require('../../../services/user');

module.exports = {
  getUsers: (req, res, next) => {
    return res.json(userService.getUsers());
  },
  createUser: async (req, res, next) => {
    const username = req.body.username;
    const password = req.body.password;
    try {
      let user = await userService.createUser(username, password);
    } catch (err) {
      next(err);
    }
  }
};

И теперь я получаю желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...