编辑:当我将 @Get('/random') 移到其他 2 条路线上方时,它正在工作......奇怪
我正在做一个 NestJS 服务器,它只获取 Breaking Bad API 的一些路由,并在服务器的路由中显示 JSON,
我想创建3条路线:
两条第一条路线有效,但我无法到达最后一条, 我收到错误 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
在 Nest 服务器中定义的路由顺序非常重要。通过在
@Get(':id')
之前添加 @Get('/random')
,您将切断对 /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();
}
}
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 并导致意外的行为。