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



EDIT:当我将@Get('/random'(移动到其他两条路由上方时,它正在工作。。。奇怪

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

我想创建3条路线:

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

两条第一条路线正在运行,但我无法获得最后一条,我收到一个错误500,上面写着错误:请求失败,状态代码为500,目标url为'https://www.breakingbadapi.com/api/characters/random',我不知道为什么是'字符'而不是'字符'

这是我的代码:

characters.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();
}
}

字符.服务.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

在Nest服务器中,定义的路由顺序非常重要。通过在@Get('/random')之前有@Get(':id'),您就切断了对/random的访问,因为底层HTTP引擎会将字符串"random"视为':id'id

我不知道为什么是"字符"而不是"字符">

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

如果您想访问/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();
}
}

最新更新