一个简易的仿造 Nest.js 的 NodeJS 后台框架。
用于学习 IoC (Inversion of Control 控制反转) 和 DI (Dependency Injection 依赖注入) 思想。
传统开发时,一切对象都由开发者手动创建,需要什么就 new 什么。并不通过中间者。
而 IoC 是一种设计思想。将原本手动创建对象的控制权交由框架处理。DI 则是 IoC 的实现。
通过这个库,可以学习到:
- 装饰器。
- 元数据。
- IoC 思想。
- DI 的实现。
@Injectable()classAppService{private_count: number=0constructor(){console.log('service init')}publicasynclogin(name: string,pwd: string){if(name==='error'){returnthis.notFound()}return(name==='test'&&pwd==='123')}publiccount(){returnthis._count++}publicnotFound(){thrownewNotFoundError('Not Found User!')}}
@Controller('user')classAppController{constructor(privatereadonlyservice: AppService,){console.log('init',service)}
@Get('home')publicHome(){return{code: 200,data: 'home'}}
@Get('not-found')
@NotFound()publicasyncNotFound(){return{code: 200,data: null,msg: 'not found'}}
@Get('login')publicasyncLogin(
@Param('name')name: string,
@Param('pwd')pwd: string){returnthis.service.login(name,pwd).then(pass=>{return{code: 200,data: 'login',count: this.service.count(),msg: pass ? 'success' : 'failure'}})}}
@Controller('user')classUserController{constructor(privatereadonlyservice: AppService){console.log('init',service)}
@Get('test')publictest(){return{count: this.service.count()}}
@Get('test-error')publictestError(){returnthis.service.notFound()}}
@Module({controllers: [AppController,UserController],providers: [AppService]})classAppModule{}constboostrap=()=>{constapp=newAppFactory(AppModule)app.start()}boostrap()# 这里也可以自己命名文件夹
mkdir SimpleNest
cd SimpleNest# 这里使用的是 pnpm# 可以根据自身喜好切换
pnpm add @types/express @types/node reflect-metadata ts-node typescript -D
pnpm add express# 初始化 ts 配置
pnpm tsc --init因为我们需要使用到装饰器和元数据,因此需要去配置文件中开启。
mkdir src
echo console.log(123 as number) > src/main.ts
pnpm ts-node src/main.ts # 123