Skip to content
On this page

完善解耦模型

Model 数据模型

从官网上对于 mongoose 的使用是基于模块化引入,我们使用 nestjs-typegoose 依赖来实现模块引入

npm i nestjs-typegoose --save

修改 main.ts 文件,在入口文件中去掉数据库连接,改为在 app.module.ts 模块中引入的方式

TS
async function bootstrap() {
    // mongoose.connect('mongodb://localhost/nestjs-test-api', {}, (err: any) => {
    //     if (err) {
    //         console.log(err, '数据库连接错误!');
    //     }
    //     console.log('数据库连接成功!');
    // });
...
}
bootstrap();
TS
// app.module.ts
import { TypegooseModule } from 'nestjs-typegoose';

@Module({
    imports: [
        TypegooseModule.forRoot('mongodb://localhost/nestjs-test-api', {}),
        PostsModule,
    ],
    controllers: [AppController],
    providers: [AppService],
})
export class AppModule { }

使用 TypegooseModule 链接数据库,再在 Post 模块下引入对应的 Post 数据模型后,可以在控制器内注入模型使用。

image.png

由上图简单的关系我们可以大致修改下对应的代码,就可以实现模块化注入模型。

先修改模型文件 post.model.ts

TS
import { prop } from '@typegoose/typegoose'; 
export class Post {
    @prop()
    title: string

    @prop()
    content: string
}

// export const PostModel = getModelForClass(Post);

可以直接导出数据模型,而不用使用原来的导出包裹方式。接着在 posts.module.ts 模块中引入对于的数据模型。

TS
import { TypegooseModule } from 'nestjs-typegoose';
import { Post } from './post.model';

@Module({
    imports: [
        TypegooseModule.forFeature([Post]),
    ],
    controllers: [PostsController],
})

在控制器中注入模型 posts.controller.ts

TS
import { ModelType } from '@typegoose/typegoose/lib/types';
import { InjectModel } from 'nestjs-typegoose';
import { Post as PostSchema } from './post.model';
export class PostsController {
    constructor(
        @InjectModel(PostSchema)
        private readonly postModel: ModelType<PostSchema>
    ) { }
    ...
}

利用 @InjectModel 装饰器后,可以在接口中通过 this.postModel 访问模型。

TS
@Controller('posts')
@ApiTags('Posts')
export class PostsController {
    constructor(
        @InjectModel(PostSchema)
        private readonly postModel: ModelType<PostSchema>
    ) { }
    @Get()
    @ApiOperation({
        summary: '获取文章列表数据',
    })
    async index() {
        return await this.postModel.find();
    }

    ...
}

这样解耦出模型,可以在任意模块注入使用。

CRUD 生成器

Nest CLI 自动生成模块所需要的代码文件。让我们的开发变得简单且高效

nest g resource
  • cmd 运行效果

image.png

  • 运行生成的模板文件

image.png

在项目根目录下执行命令后,可以生成所有的 Nest 构建文件,包括模块、服务、控制器,也生成了实体类,DTO 类和测试文件。只关心模型定义实现业务即可。

总结

到此,对于 Nest 我们熟悉了基本的使用规则,后续接着实现如何在项目内管理多个子项目。