NestJS开发Ninja API时,GET按ID请求出现内部服务器错误
问题分析与修复方案
核心错误原因
你的API触发内部服务器错误,根源是NinjasService中的两个方法存在回调函数未返回判断结果的问题:
1. getNinja方法的Array.find回调无返回值
getNinja里的find回调没有返回ninja.id === id的判断逻辑,导致find始终返回undefined,进而触发throw new Error('ninja not found')。普通Error会被Nest识别为500内部服务器错误。
2. removeNinja方法的Array.filter回调无返回值
removeNinja中的filter回调同样未返回判断结果,导致过滤逻辑失效,无法正确删除指定ID的忍者。
修复后的完整代码
NinjasService 修复版
import { Injectable, NotFoundException } from '@nestjs/common'; import { CreateNinjaDto } from './dto/create-ninja.dto'; import { UpdateNinjaDto } from './dto/update-ninja.dto'; @Injectable() export class NinjasService { private ninjas= [ {id:0, name:'NinjaA', weapons: 'blades'}, {id:1, name:'NinjaB', weapons:'nunchunks'}, ]; getNinjas(weapons?: 'blades'|'nunchunks') { if(weapons){ return this.ninjas.filter((ninja)=> ninja.weapons === weapons); } return this.ninjas; } getNinja(id:number) { // 修复:给find回调添加返回值 const ninja=this.ninjas.find((ninja)=>{ return ninja.id === id; }); // 优化:用Nest内置的NotFoundException返回标准404错误,而非普通Error if(!ninja){ throw new NotFoundException('ninja not found'); } return ninja; } createNinja(createNinjaDto : CreateNinjaDto) { const newNinja = { ...createNinjaDto, id: Date.now(), }; this.ninjas.push(newNinja); return newNinja; } updateNinja(id:number, updateNinjaDto: UpdateNinjaDto) { this.ninjas = this.ninjas.map((ninja)=>{ if(ninja.id===id) { return {...ninja , ...updateNinjaDto}; } return ninja; }); return this.getNinja(id); } removeNinja(id:number){ const ninjaRemove=this.getNinja(id); // 修复:给filter回调添加返回值 this.ninjas= this.ninjas.filter((ninja)=>{ return ninja.id !== id; }) return ninjaRemove; } }
额外优化建议
- 替换普通
Error为Nest内置的NotFoundException,可以返回标准的404 HTTP状态码,更符合REST API规范。 - 可以在Controller层使用
ParseIntPipe自动处理ID参数的类型转换与验证,省去手动转换的麻烦:
// 先从@nestjs/common导入ParseIntPipe @Get(':id') getOneNinja(@Param('id', ParseIntPipe) id: number){ return this.ninjasService.getNinja(id); }
内容的提问来源于stack exchange,提问作者Akash Anand
相关产品推荐
相关产品推荐

