尝试实现 api 时出现内部服务器错误

问题描述 投票:0回答:1

我正在创建一个忍者 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;
    }



}


```

rest nestjs internal-server-error
1个回答
0
投票

解决方案

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')
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.