NestJs 中请求 url 中不存在 Path Param 时如何手动处理?

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

我是 Nest 的新手,正在做一个我正在学习的项目。但今天我被困在做以下事情:

@Delete('remove/:id')
removePartner(@Param() param: ParamDto) {
  return this.service.delete(param.id);
}

哪里的

ParamDto
是这样的:

export class ParamDto {
  @IsMongoId()
  @IsNotEmpty()
  id: string;
}

现在,如果

id
为空,我想验证并抛出错误,但是只要我向
DELETE
发送
/remove
请求,Nest 就会返回以下错误:

{
    "message": "Cannot DELETE /remove/",
    "error": "Not Found",
    "statusCode": 404
}

我不希望这样抛出错误。我能做什么?

我尝试过另一条

/remove
喜欢的路线

@Delete('/remove')
@Delete('/remove/:id')
// ... rest of the code

但是,虽然它确实在我的验证中抛出错误,但

/remove/:id
路线不再起作用。

我还搜索了谷歌并询问了ChatGPT,但我认为我无法正确传达我的问题,所以我得到了验证我已经在做的

@Param
的结果,但不是我面临的问题。

typescript validation nestjs
1个回答
0
投票

404
错误意味着 Nest 无法找到您尝试到达的路线。路线
/remove/:id
/remove/
不同。当您执行
DELETE /remove/
时,它被视为
DELETE /remove
而不是
DELETE /remove/<missing-id>

您不能在控制器函数上使用多个路由装饰器,如果这样做,将考虑最后评估的装饰器(这将是列表中第一个出现的装饰器),因此对于代码片段 -

@Delete('/remove')
@Delete('/remove/:id')
// ... rest of the code

路线将被映射到

DELETE /remove
而不是
DELETE /remove/:id
。您可以通过查看 Nest 应用程序的日志来验证,您将看到类似 -

的内容
LOG [RouterExplorer] Mapped {/remove, DELETE} route +0ms

如果您希望控制器函数用于具有单个 http 动词的多个路由,则必须在数组中提供路径,在您的情况下是这样的 -

@Delete(['/remove/:id', '/remove'])
removePartner(@Param() param: ParamDto) {
  return this.service.delete(param.id);
}

有了这个,如果你尝试

DELETE /remove
,你会得到你所期望的错误。干杯!

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