findByUsername() returns 空白页

findByUsername() returns blank page

我正在使用 mongodb (mongoose) 学习 nestjs,我正在尝试从数据库中获取单个用户。

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})
    }
}

users.controller.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 & 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 Postman 也没有返回任何东西。

有什么想法吗?

您的 @Get(':username') 路由处理程序定义它应该有一个 username 参数传递给它,但没有告诉 Nest 如何 传递它。您可以在此处执行以下两项操作之一:

  1. 使用 @Param('username') 直接从 req.params['username'] 中提取用户名。快速简单

  2. @Param() { username }解构req.params只取出username(反正应该是唯一的值)。这种方法的好处是能够使用 ValidationPipe 和 DTO class 来表示 req.params 对象。使用第二种方法,您的 @Get(':username') 方法将如下所示:

Get(':username')
async findOne(@Param() { username }: UsernameParams) {
  return this.usersService.findByEmail(username);
}