#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, как его передать. Здесь вы можете сделать одну из двух вещей:
- используйте
@Param('username')
для извлечения имени пользователя непосредственно изreq.params['username']
. Быстро и просто - используйте
@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);
}