首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从自定义类nodejs抛出错误

如何从自定义类nodejs抛出错误
EN

Stack Overflow用户
提问于 2022-09-05 12:20:25
回答 1查看 145关注 0票数 1

我试图在带有类型记录的节点js中创建一个全局错误处理程序。我创建了一些扩展错误类的自定义类,如下所示:-

自定义类

代码语言:javascript
复制
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;
}

坏请求错误类

代码语言:javascript
复制
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;

server.js

代码语言:javascript
复制
dotenv.config();
const app: Express = express();

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

routes.ts

代码语言:javascript
复制
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

代码语言:javascript
复制
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;

全局错误处理程序

代码语言:javascript
复制
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;

我在控制器catch块和坏请求错误类中得到错误,但是在那之后,我的全局错误处理程序中间件函数无法得到这个错误,因此,我无法发送这个错误作为响应。

我不知道我做错了什么,也不知道如何调用我的中间件函数而不从控制器抛出实际的错误,我想使用我的自定义错误类来格式化错误和状态代码。

EN

回答 1

Stack Overflow用户

发布于 2022-09-06 05:31:52

在Express v4中,您需要在异步控制器中手动调用next(),以使错误处理中间件工作。

对于路由处理程序和中间件调用的异步函数返回的错误,必须将它们传递给下一个()函数,在该函数中Express将捕获并处理它们。

代码语言:javascript
复制
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你就不用这么做了

5开始,返回承诺的路由处理程序和中间件将在拒绝或抛出错误

时自动调用next(值)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73609274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档