Как выполнить pipe (ValidateObjectId) перед защитой (ResourceOwnerGuard)? - PullRequest
0 голосов
/ 14 апреля 2019

Я играю с nestjs и mongoose.

Код:

class BrevesController {

    constructor(private readonly brevesService: BrevesService) { }
     // Here is used BreveOwnerGuard(1)
    @UseGuards(JwtAuthGuard, BreveOwnerGuard)
    @Get(':breveId')
    // Here is used ValidateObjectId(3)
    async getById(@Param('breveId', ValidateObjectId) id: string) {
        return await this.brevesService.getById(id)
    }
}

class BreveOwnerGuard {

    constructor(private readonly brevesService: BrevesService) { }

    async canActivate(context: ExecutionContext) {
        const req = context.switchToHttp().getRequest()
        const {user, params} = req
        const {breveId} = params
        // This is executed before ValidateObjectId in getById 
        // route handler and unknown error is thrown but we
        // have pipe for this.(2)
        const breve = await this.brevesService.getById(breveId)
        const breveCreatorId = breve.creatorId.toString()
        const userId = user.id
        return breveCreatorId === userId
    }
}

Так что после запроса / breves /: breveId с неверным идентификатором объекта, BreveOwnerGuard выполняется до ValidateObjectId и неизвестеношибка брошена.

Есть ли способ для этого потока проверить ObjectId перед BreveOwnerGuard?

Или что мне делать в этом случае?Что ожидается?

1 Ответ

0 голосов
/ 17 июля 2019

Защита выполняется после каждого промежуточного программного обеспечения, но перед любым перехватчиком или каналом.

Вы мало что можете сделать, кроме как заменить ResourceOwnerGuard на трубу или ValidateObjectId на Стража.

...