【问题标题】:Nestjs - Routes defined within controllers are overriding each otherNestjs - 控制器中定义的路由相互覆盖
【发布时间】:2018-08-24 04:53:56
【问题描述】:

我有一个控制器

//imports etc
...

@Get('me')
async get(@Req res): Promise<UserVm> {
    // extract auth user from request object
    // return auth user
}

@Get(':id') // uuid
async get(@Param('id') id: string): Promise<UserSummaryVm> {
    // return a summary user profile
}
...

但是,/:id 覆盖了/me。我试过重新排序路线无济于事。我总是收到以下错误:

[Nest] 94764   - 8/23/2018, 7:45:50 PM   [ExceptionsHandler] Could not find 
any entity of type "User" matching: "me"
EntityNotFound: Could not find any entity of type "User" matching: "me"
at new EntityNotFoundError
([PROJECT_ROOT]\src\error\EntityNotFoundError.ts:11:9)
at [PROJECT_ROOT]\src\entity-manager\EntityManager.ts:622:39
at process._tickCallback (internal/process/next_tick.js:68:7)

我该如何解决这个问题?任何提示或指针表示赞赏。

【问题讨论】:

  • 这在一天结束时仍然是 javascript,我们没有其他 OOP 语言所拥有的那种“花哨的”重载方法。只需以不同的方式命名您的方法(getById 和 get)

标签: nestjs


【解决方案1】:

默认情况下,所有 API-Endpoint 都使用此标准显示:

GET    ../user      =>  [user1, user2, user3]
GET    ../user/1    =>  user1
PUT    ../user/1    =>  user1(that updated)
DELETE ../user/1    =>  user1(that deleted)

解决方案 A

这意味着常规模式必须遵循此顺序,但对于像您这样的新情况或案例,它可以使用其他方法,例如:

GET  ../user       =>  [user1, user2, user3] all user
GET  ../user/id/1  =>  user1
GET  ../user/me    =>  userX

解决方案 B

改变方法在课堂上的位置可能会影响你的反应。

@Get(':id')
async get(@Param('id') id: string): Promise<UserSummaryVm> {
    if ( !Number.isInteger(id) ) next();
    ...
}

@Get('me')
async get(@Req res): Promise<UserVm> {
    ...
}

在这个安排中,检查所有请求,如果它们在 URL 中有类似 id 的数字,将被 @Param('id') id: string 先执行,如果请求参数中没有数字则继续执行。

 if ( !Number.isInteger(id) ) next();

如果输入参数不是INTEGER,If语句改变角色并进入下一个中间件。

【讨论】:

    猜你喜欢
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    相关资源
    最近更新 更多