初始化prisma
在server文件夹下,执行命令npx prisma init。于是在server文件夹下,就创建了prisma目录
在server目录下创建新模块
不需要来回切换目录。执行命令:nest g res user --project server。这个命令是在根目录下执行的(server),但是它会自动找到server/server/src,然后将user模块写入,并自动和app.module进行绑定
在ai中创建chat模块
同理:nest g res chat --project ai
shared中创建
在server/libs/shared/src创建prisma nest g mo prisma --project shared
nest g s prisma --project shared 显然prisma是ai和server都需要使用的,因此需要将prisma注册为全局模块
- 在shared/src/index.ts中,将prisma的service+module导出
js
export * from './prisma/prisma.service'
export * from './prisma/prisma.module'
- 在prisma.module中导出prisma的service
js
@Module({
providers:[PrismaService],
exports:[PrismaService]
})
- 在shared.module中导出prismaModule
js
@Module({
providers:[SharedService],
exports:[SharedService,PrimsaService],
imports:[PrimsaModule]
})
- 将shared.module扩充为全局模块(
@Global)
js
@Global()
@Module({
imports:[PrimsaModule],
providers:[SharedService],
exports:[SharedService,PrimsaModule],
})
- 在app.module中注册一下
js
@Module({
imports:[UserModule,SharedModule],
controllers:[AppController],
providers:[AppService],
})
Tips:如果Prisma是一个独立的基础设施模块,可以直接让PrismaModule自己@Glabal()
js
@Global()
@Module({
providers: [PrismaService],
exports: [PrismaService],
})
export class PrismaModule {}
但是,这里我们希望把所有的共享基础设施(比如有PrismaModule,RedisModule,LoggerModule)都通过SharedModule做统一出口暴露,就要采用上面的方式,将SharedModule做全局模块聚合 此外关于@Global和export * from './prisma/prisma.service':
@Global解决的是运行时的依赖注入问题,通过它可以实现其它模块这样注入:
js
constructor(private readonly prisma: PrismaService) {}
但 @Global() 不会让 TypeScript 自动知道 PrismaService 从哪里import。因此此时导入需要写很长的路径:import { PrismaService } from 'libs/shared/src/prisma/prisma.service' 但是,通过
js
export * from './prisma/prisma.module'
export * from './prisma/prisma.service'
我们可以写import { PrismaService } from '@app/shared'
简单测试一下,记得将nest-cli.json中的webpack配置项删除(我们并不希望通过webpack进行编译)