我正在创建一个忍者 API,其中包括创建忍者、更新忍者、通过忍者 ID 获取忍者以及删除它们。我为此使用 Nest js。当我尝试通过 id 发送 GET 请求时,它出现内部服务器错误。我认为由于参数中的字符串类型而出现错误,但转换为数字后它仍然相同。
下面是忍者控制器代码
import { Body, Controller, Delete, Get, Param, Post, Put, Query } from '@nestjs/common';
import { CreateNinjaDto } from './dto/create-ninja.dto';
import { UpdateNinjaDto } from './dto/update-ninja.dto';
import { NinjasService } from './ninjas.service';
@Controller('ninjas')
export class NinjasController {
constructor(private readonly ninjasService: NinjasService){}
//GET REQUEST
@Get()
getNinjas(@Query('weapons') weapons: 'blades'| 'nunchunks'){
// const service = new NinjasService();
return this.ninjasService.getNinjas(weapons) ;
}
@Get(':id')
getOneNinja(@Param('id') id:string){
return this.ninjasService.getNinja(+id);
}
@Post()
createNinja(@Body() createNinjaDto: CreateNinjaDto){
return this.ninjasService.createNinja(createNinjaDto);
}
@Put(':id')
updateNinja(@Param('id') id:string , @Body() updateNinjaDto: UpdateNinjaDto)
{
// const idx=Number(id)
return this.ninjasService.updateNinja(+id , updateNinjaDto);
}
@Delete(':id')
removeNinja(@Param('id') id:string)
{
// const idx=Number(id)
return this.ninjasService.removeNinja(+id);
}
}
忍者服务代码
import { Injectable } 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)
{
const ninja=this.ninjas.find((ninja)=>{
ninja.id===id
});
if(!ninja){
throw new Error('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);
this.ninjas= this.ninjas.filter((ninja)=>{
ninja.id!==id
})
return ninjaRemove;
}
}
```
NinjasService.getNinja() 需要一个数字,但它是用字符串调用的。
@Get(':id')
getOneNinja(@Param('id') id:string){ // <- param id is a string!
return this.ninjasService.getNinja(+id); // <- performing +string will result in NaN
}
您需要使用管道将其转换为实际数字:
@Get(':id')
getOneNinja(@Param('id', ParseIntPipe) id:number){ // <- param id is now a number
return this.ninjasService.getNinja(id);
}
查询参数始终是字符串。在 Javascript 中,像这样的类型不匹配将导致 NaN,这不足以引发错误。
但是,您使用此值与数据对象进行比较,NaN 永远不会匹配任何数字。由于未找到忍者,因此您的代码会抛出“未找到忍者”错误。
const ninja=this.ninjas.find((ninja)=>{
ninja.id===id // <- this will never be true
});
if(!ninja){
throw new Error('ninja not found');
}
您可以通过抛出正确的 HTTP 代码错误来提供更清晰的响应,而不是抛出一般的 JS 错误。 NestJS 有所有这些的类,“未找到”的类是这样的:
if(!ninja){
throw new NotFoundException('ninja not found')
}