Пользовательский декоратор Nest JS возвращает неопределенное значение - PullRequest
1 голос
/ 19 марта 2020

Доброе утро,

Я пытаюсь создать собственный декоратор: user.decorator.ts

import { createParamDecorator, ExecutionContext } from '@nestjs/common';

export const User = createParamDecorator(
  (data: string, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    const user = request.user;

    return data ? user && user[data] : user;
  },
);

user.entity.ts

import { Entity, PrimaryGeneratedColumn, Column, BeforeInsert } from "typeorm";
import * as bcrypt from 'bcryptjs';
import * as jwt from 'jsonwebtoken';
import { UserRO } from "./user.dto";

@Entity("user")
export class UserEntity {

    @PrimaryGeneratedColumn('uuid')
    id: string;

    @Column({
        type: 'varchar',
        length: 50,
        unique: true,
    })
    username: string;

    @Column('text')
    password: string;

    @Column('text')
    role: string;

    (...)
}

И, наконец, user.controller.ts (только полезная часть):

(...)
    @Post('login')
    @UsePipes(new ValidationPipe())
    login(@Body() data: UserDTO,  @User('role') role: string) {
        console.log(`hello ${role}`);
        return this.userService.login(data);
(...)
    }

Моя проблема: console.log (...) возвращает мне hello undefined, когда ожидаемый ответ должен быть hello admin (роль администратора - роль пользователя в базе данных)

РЕДАКТИРОВАТЬ: Я также попытался console.log(user) в моем декораторе, и он тоже не определен.

EDIT2: Мой HttpErrorFilter также говорит: Cannot read property 'role' of undefined

Я внимательно следил за документацией и не могу понять, где проблема (https://docs.nestjs.com/custom-decorators).

Спасибо за ваше время.

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Я нашел решение.

В user.decorator.ts:

Изменить const user = request.user; на const user = request.body;

В соответствии с гнездом js do c, это должно быть .user, но когда я посмотрел глубже в запросе, я заметил, что не было «пользователя», но было «тело» со всей информацией. (https://docs.nestjs.com/custom-decorators)

Не могу определить, испортил ли я раньше или устаревший do c.

Проблема решена вообще!

РЕДАКТИРОВАТЬ: 2-е решение:

Я забыл использовать @UseGuards(new AuthGuard()) сверху, и request.user создается с AuthGuard ..

0 голосов
/ 20 марта 2020

Я тоже запутался по этому поводу. Я обновился до Nest JS 7 и, следуя руководству по миграции , пытался обновить мой пользовательский декоратор.

Часть, которую я не смог получить, это const request = ctx.switchToHttp().getRequest();. По какой-то причине getRequest() возвращал undefined.

Для меня это сработало:

import { createParamDecorator, ExecutionContext } from '@nestjs/common';

export const CurrentUser = createParamDecorator(
  (data: unknown, ctx: ExecutionContext) => {
    return ctx.getArgByIndex(2).req.user;
  }
);

контекст выполнения документы рекомендуют против getArgByIndex(), поэтому я ' Я уверен, что я делаю что-то простое неправильно. Интересует, что скажут другие ответы и комментарии.

...