findByUsername() возвращает пустую страницу

#mongoose #nestjs

Вопрос:

Я изучаю nestjs с mongodb (мангуст) и пытаюсь получить одного пользователя из базы данных.

users.service.ts

 @Injectable()
export class UsersService {
    constructor(@InjectModel(User.name) private readonly userModel: Model<UserDocument>,) {}

    async create(createUserDto: CreateUserDto): Promise<User> {
        const createdUser = new this.userModel(createUserDto);
        return createdUser.save();
    }

    async findAll(): Promise<User[]> {
        return this.userModel.find().exec();
    }

    async findByUsername(username: string): Promise<User | undefined> {
        return this.userModel.findOne({username})
    }
}
 

пользователи.контроллер.ts

 @UseGuards()
@Controller('/api/users')
export class UsersController {
    constructor(private readonly usersService: UsersService) {
    }

    @Post()
    async create(@Body() user: CreateUserDto) {
        await this.usersService.create(user);
    }

    @Get()
    async findAll(): Promise<User[]> {
        return this.usersService.findAll();
    }

    @Get(':username')
    async findOne(username: string): Promise<User> {
        return this.usersService.findByUsername(username);
    }
}
 

users.schema.ts

 export type UserDocument = User amp; Document;

@Schema()
export class User {
    @Prop()
    firstname: string;

    @Prop()
    lastname: string;

    @Prop({required: true})
    username: string;

    @Prop({required: true})
    password: string;

    @Prop({default: false})
    isAdmin: boolean;
}

export const UserSchema = SchemaFactory.createForClass(User);
 

Проблема в том, что при переходе на http://localhost:3000/api/users/username
и Почтальон тоже ничего не возвращает.

почтальон, достань

Есть какие-нибудь идеи?

Комментарии:

1. Вы уверены, что это имя пользователя что-то возвращает? Ваш скриншот не показывает достаточно, чтобы я мог помочь

Ответ №1:

Ваш @Get(':username') обработчик маршрута определяет, что ему должен быть username передан параметр, но не сообщает Nest, как его передать. Здесь вы можете сделать одну из двух вещей:

  1. используйте @Param('username') для извлечения имени пользователя непосредственно из req.params['username'] . Быстро и просто
  2. используйте @Param() { username } для деконструкции req.params , чтобы просто вытащить username (в любом случае это должно быть единственное значение). Преимущество этого подхода заключается в возможности использовать ValidationPipe класс with a DTO для представления req.params объекта. При втором подходе ваш @Get(':username') метод будет выглядеть следующим образом:
 Get(':username')
async findOne(@Param() { username }: UsernameParams) {
  return this.usersService.findByEmail(username);
}