簡體   English   中英

如何從自定義 class nodejs 拋出錯誤

[英]How to throw error from custom class nodejs

我正在嘗試使用 typescript 在節點 js 中創建一個全局錯誤處理程序。 我創建了一些擴展錯誤 class 的自定義類,如下所示:-

定制 class

export abstract class CustomError extends Error {
  abstract statusCode: number;
  abstract errorMessage: string;
  abstract data: unknown;
  constructor() {
    super();
    Object.setPrototypeOf(this, CustomError.prototype);
  }

  abstract serializeError(): { message: string; fields?: string }[] | string;
}

錯誤請求錯誤 class

import { StatusCodes } from 'http-status-codes';

import { CustomError } from './custom.error';

class BadRequestException extends CustomError {
  statusCode = StatusCodes.BAD_REQUEST;
  errorMessage: string;
  data: any;

  constructor(errorMessage?: string) {
    super();
    // set default value
    this.errorMessage = errorMessage || 'Bad Request';

    Object.setPrototypeOf(this, BadRequestException.prototype);
  }

  serializeError() {
    return this.errorMessage;
  }
}

export default BadRequestException;

服務器.js

dotenv.config();
const app: Express = express();

app.use('/', routes);
app.use(globalErrorHandler);
export default app;

路線.ts

import express from 'express';
import UserController from '../controller/user/user-controller';
import NotFoundException from '../exception/not-found-exception';
import authorizationMiddleware from '../middleware/authorization-middleware';

const router = express.Router();

// users routes
router.post('/user/create', UserController.createUser);
router.get('/user/profile/:key', UserController.getProfile);
router.get('/user/directus', UserController.getDirectUs);

router.use('*', () => {
  throw new NotFoundException();
});

export default router;

controller.ts

import { Request, Response } from 'express';
import { StatusCodes } from 'http-status-codes';
import { directus } from '../../config/directus-confgi';
import BadRequestException from '../../exception/bad-request-exception';
import { USER } from '../../interface/user-interface';
import UserService from './user.service';

class UserController {
 
  // getting user profile
  static async getDirectUs(request: Request, response: Response) {
    try {
      const user = await directus.items('articles').readOne(15);

      response.status(StatusCodes.OK).json({ user });
    } catch (error: any) {
      throw new BadRequestException(error.message);
    }
  }
}

export default UserController;

全局錯誤處理程序

import { StatusCodes } from 'http-status-codes';
import { Request, Response, NextFunction } from 'express';
import { CustomError } from '../exception/custom.error';

const globalErrorHandler = (err: any, req: Request, res: Response,next:NextFunction) => {
  if (err instanceof CustomError) {
    const error: { message: string; errors?: any } = {
      message: err.errorMessage ? req.body.i18nObj.__(err.errorMessage) : '',
    };

    if (err.data) error.errors = err.serializeError();

    return res.status(err.statusCode).json(error);
  }

  res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
    message: err.message
      ? err.message
      : req.body.i18nObj.__('MESSAGES.UNABLE_COMPLETE_REQUEST'),
    error: { message: err.message, err },
  });
};

export default globalErrorHandler;


我的 controller 捕獲塊和錯誤請求錯誤 class 出現錯誤,但之后我的全局錯誤處理程序中間件 function 無法在響應中發送此錯誤,因為我無法發送此錯誤,

我不知道我做錯了什么或者如何調用我的中間件 function 而不會從 controller 引發實際錯誤我想使用我的自定義錯誤 ZA2F2ED4F8EBC2CBB4C21A29DC40AB61Z 來匹配錯誤和狀態代碼

在 Express v4 中,您需要在異步控制器中手動調用next()才能使錯誤處理中間件正常工作。

捕捉錯誤

對於由路由處理程序和中間件調用的異步函數返回的錯誤,您必須將它們傳遞給 next() function,Express 將在其中捕獲並處理它們。

class UserController {
  // getting user profile
  static async getDirectUs(
    request: Request,
    response: Response,
    next: NextFunction
  ) {
    try {
      const user = await directus.items("articles").readOne(15);

      response.status(StatusCodes.OK).json({ user });
    } catch (error: any) {
      // pass the custom error to `next()`
      next(new BadRequestException(error.message));
    }
  }
}

從 Express v5 開始,您不必這樣做

從 Express 5 開始,返回 Promise 的路由處理程序和中間件將在拒絕或拋出錯誤時自動調用 next(value)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM