我是 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
的结果,但不是我面临的问题。
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
,你会得到你所期望的错误。干杯!