区分控制器的2条路由(NestJS)

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

编辑:当我将 @Get('/random') 移到其他 2 条路线上方时,它正在工作......奇怪

我正在做一个 NestJS 服务器,它只获取 Breaking Bad API 的一些路由,并在服务器的路由中显示 JSON,

我想创建3条路线:

  • 1 返回节目中所有字符的 JSON (/characters/all)
  • 1 返回节目中单个字符的 JSON (/characters/:id)
  • 1 返回节目中随机字符的 JSON (/character/random)

两条第一条路线有效,但我无法到达最后一条我收到错误 500,显示错误:请求失败,状态代码为 500,目标网址为“https://www.writingbadapi.com/api/characters/random”,我不知道为什么它是“字符”而不是“性格”

这是我的代码:

字符.controller.ts

import { Controller, Get, Post, Body, Param } from '@nestjs/common';
import { CharactersService } from './characters.service';

@Controller('characters')
export class CharactersController {
    constructor(private readonly charactersService: CharactersService) {}

    @Get('/all')
    getAll() {
        return this.charactersService.getAll();
    }

    @Get(':id')
    getOne(@Param('id') id: string) {
        return this.charactersService.getOne(id);
    }

    @Get('/random')
    getRandom() {
        return this.charactersService.getRandom();
    }
}

字符.service.ts

import axios from "axios";

import { Injectable } from '@nestjs/common';

@Injectable()
export class CharactersService {
    getAll() {
      return axios.get(`${process.env.ENDPOINT_BASE_URL}/characters`, {
        params: {
          limit: null,
          offset: null,
          name: ""
        }
      }).then(function (response) {
          return response.data;
        })
        .catch(function (error) {
          console.log(error);
        });
    }

    getOne(id: string) {
      return axios.get(`${process.env.ENDPOINT_BASE_URL}/characters/${id}`).then(function (response) {
        return response.data;
      })
      .catch(function (error) {
        console.log(error);
      });
    }

    getRandom() {
      return axios.get(`${process.env.ENDPOINT_BASE_URL}/character/random`).then(function (response) {
        return response.data;
      })
      .catch(function (error) {
        console.log(error);
      });
    }
}

.env

ENDPOINT_BASE_URL=https://www.breakingbadapi.com/api
javascript node.js nestjs
3个回答
25
投票

在 Nest 服务器中定义的路由顺序非常重要。通过在

@Get(':id')
之前添加
@Get('/random')
,您将切断对
/random
的访问,因为底层 HTTP 引擎会将字符串
"random"
视为
id
':id'

我不知道为什么是“角色”而不是“角色”

如上所述,

random
被拉入为
id
而不是路线本身。将
@Get('/random')
路线和处理程序移动到上面
@Get(':id')
应该可以解决这个问题。


3
投票

如果您想要访问

/character/random
,您需要创建另一个服务于
character
路线的控制器。示例

@Controller('characters')
export class CharactersController {
    constructor(private readonly charactersService: CharactersService) {}

    @Get('/all')
    getAll() {
        return this.charactersService.getAll();
    }

    @Get(':id')
    getOne(@Param('id') id: string) {
        return this.charactersService.getOne(id);
    }
}

@Controller('character')
export class CharacterController {
    constructor(private readonly charactersService: CharactersService) {}

    @Get('/random')
    getRandom() {
        return this.charactersService.getRandom();
    }
}

0
投票
export class COntentController {
    @Get(':id')
    async findOneById(@Param('id') id: string): Promise<any> {
        // Handle request for specific ID
    }

    @Get(':url')
    async handleUrl(@Param('url') url: string): Promise<any> {
        // Handle more generic URL requests
    }
}

用这个代替这个

@Get('*')
async handleUrl(@Param('url') url: string): Promise<any> {
    // Handle more generic URL requests
}

这个“*”将接受所有被称为通配符路由的东西, 应谨慎使用此方法,因为它可能会匹配非预期的 URL 并导致意外的行为。

© www.soinside.com 2019 - 2024. All rights reserved.