【Exceptions】mermaid Flowchart is not a function / null is not an object

本文档介绍了Mermaid Flowchart中常见的两种错误:'exception1 is not a function'和'null is not an object'。错误1通常是由于在设置变量后未加空格导致的语法错误,而错误2表明某个节点缺少必要的类型描述。解决这些问题需要对Mermaid语法有深入理解,并确保每个节点都正确配置了类型。

mermaid flowchart 的文档:点这

exception1

is not a function.
在这里插入图片描述
这种报错,是因为我在设置变量后没有加空格:
在这里插入图片描述

exception2

null is not an object. 节点没有描述类型
在这里插入图片描述

<think> 我们正在处理一个NestJS异常处理问题,用户遇到了"exception.getStatus is not a function"错误。这个错误通常发生在异常处理过程中,当尝试调用一个不是函数的属性时。在NestJS中,这通常是因为抛出的异常对象不是HttpException或其子类的实例,因此没有getStatus方法。 ### 错误原因分析 1. **抛出非标准异常对象**:可能抛出了一个普通对象、字符串或Error对象,而不是HttpException。 2. **自定义异常未继承HttpException**:如果自定义异常类没有正确继承自HttpException,则不会有getStatus方法。 3. **第三方库抛出非NestJS异常**:使用了第三方库,该库抛出的是普通Error对象。 ### 解决方案 #### 步骤1: 确保抛出HttpException 在需要抛出异常的地方,使用NestJS内置的HttpException类或其子类(如BadRequestException, NotFoundException等): ```typescript import { HttpException, HttpStatus } from '@nestjs/common'; // 正确示例 throw new HttpException('错误信息', HttpStatus.BAD_REQUEST); // 使用内置快捷异常类 throw new BadRequestException('无效请求'); ``` #### 步骤2: 检查自定义异常类 如果使用了自定义异常,确保它继承自HttpException: ```typescript import { HttpException, HttpStatus } from '@nestjs/common'; export class CustomException extends HttpException { constructor() { super('自定义错误信息', HttpStatus.FORBIDDEN); } } // 使用 throw new CustomException(); ``` #### 步骤3: 全局异常过滤器处理非标准异常 如果无法避免第三方库抛出非HttpException异常,可以在全局异常过滤器中处理这种情况: ```typescript import { ExceptionFilter, Catch, ArgumentsHost, HttpException, HttpStatus } from '@nestjs/common'; @Catch() export class AllExceptionsFilter implements ExceptionFilter { catch(exception: unknown, host: ArgumentsHost) { const ctx = host.switchToHttp(); const response = ctx.getResponse(); const request = ctx.getRequest(); // 检查是否是HttpException,否则构建一个 const status = exception instanceof HttpException ? exception.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR; const message = exception instanceof HttpException ? exception.getResponse() : '内部服务器错误'; response.status(status).json({ statusCode: status, timestamp: new Date().toISOString(), path: request.url, message, }); } } ``` #### 步骤4: 注册全局过滤器 在main.ts中注册全局过滤器: ```typescript import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { AllExceptionsFilter } from './all-exceptions.filter'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalFilters(new AllExceptionsFilter()); // 注册全局过滤器 await app.listen(3000); } bootstrap(); ``` ### 调试技巧 1. **日志记录**: 在异常过滤器中记录异常的详细信息,以便了解抛出的具体内容: ```typescript console.error('捕获异常:', exception); ``` 2. **类型检查**: 使用`instanceof`判断异常类型,避免调用不存在的方法。 ### 常见错误场景 - **异步代码中抛出普通Error**: ```typescript async function problematicFunction() { throw '字符串错误'; // 错误!应使用HttpException } ``` - **手动抛出错误对象**: ```typescript throw new Error('普通错误'); // 不会被NestJS异常过滤器正确捕获 ``` ### 注意事项 - NestJS默认的全局异常过滤器只能处理`HttpException`及其子类。 - 任何未被处理的异常(非HttpException)都会触发`500 Internal Server Error`。 §§相关问题§§ 1. 如何自定义NestJS异常过滤器的响应格式? 2. 在NestJS中如何捕获并处理特定类型的异常? 3. 为什么在NestJS中抛出非HttpException会导致500错误? 4. 如何在NestJS中创建自定义的HTTP异常类? 5. 全局异常过滤器和控制器级别的异常过滤器有何区别? </think> ### NestJS 中 "exception.getStatus is not a function" 错误解决方案 #### 🔍 错误原因分析 1. **异常对象类型错误**(核心原因) - 抛出的对象不是 `HttpException` 或其子类实例 - 常见于: ```typescript // 错误示例 ❌ throw { message: "Unauthorized" }; // 正确应为 ✅ throw new UnauthorizedException(); ``` 2. **自定义异常未正确继承** ```typescript // 错误的自定义异常 class CustomError { constructor(message) { this.message = message; } } // 缺少 getStatus() 方法 ``` 3. **异步操作中未捕获的异常** - Promise 链中抛出的非 HttpException: ```typescript async function fetchData() { throw new Error("DB error"); // 非 HttpException } ``` #### ️ 完整解决方案 ##### 方案 1:确保抛出正确的异常类型 ```typescript import { HttpException, HttpStatus, BadRequestException } from '@nestjs/common'; // 正确抛出方式 throw new HttpException('自定义消息', HttpStatus.FORBIDDEN); throw new BadRequestException('参数错误'); ``` ##### 方案 2:修复自定义异常类 ```typescript import { HttpException, HttpStatus } from '@nestjs/common'; class CustomException extends HttpException { constructor() { super('自定义错误消息', HttpStatus.I_AM_A_TEAPOT); } } // 使用 throw new CustomException(); ``` ##### 方案 3:全局异常过滤器增强 ```typescript import { Catch, ExceptionFilter, ArgumentsHost } from '@nestjs/common'; @Catch() export class AllExceptionsFilter implements ExceptionFilter { catch(exception: unknown, host: ArgumentsHost) { const ctx = host.switchToHttp(); const response = ctx.getResponse(); // 处理非标准异常 const status = exception instanceof HttpException ? exception.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR; const message = exception instanceof HttpException ? exception.getResponse() : '服务器内部错误'; response.status(status).json({ statusCode: status, timestamp: new Date().toISOString(), message }); } } ``` 注册全局过滤器: ```typescript // main.ts app.useGlobalFilters(new AllExceptionsFilter()); ``` ##### 方案 4:处理异步异常 ```typescript // 使用 try-catch 包装 async createItem() { try { await externalService.call(); } catch (error) { throw new BadGatewayException('服务调用失败'); } } ``` #### ✅ 调试验证步骤 1. **检查异常来源**: ```typescript console.log('异常类型:', exception.constructor.name); console.log('是否 HttpException:', exception instanceof HttpException); ``` 2. **测试不同异常场景**: ```typescript // 测试用例 it('应正确处理自定义异常', () => { expect(() => throw new CustomException()).toThrow(CustomException); }); ``` #### ️ 注意事项 1. **避免直接抛出纯字符串或普通对象** 2. **第三方库异常需转换**: ```typescript try { jwt.verify(token, secret); } catch (error) { throw new UnauthorizedException('令牌无效'); } ``` 3. 在拦截器中处理响应时应检查 `exception.getStatus` 是否存在
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值