一个简易的仿造 Nest.js 的 NodeJS 后台框架。
用于学习 IoC (Inversion of Control 控制反转) 和 DI (Dependency Injection 依赖注入) 思想。
传统开发时,一切对象都由开发者手动创建,需要什么就 new 什么。并不通过中间者。
而 IoC 是一种设计思想。将原本手动创建对象的控制权交由框架处理。DI 则是 IoC 的实现。
通过这个库,可以学习到:
- 装饰器。
- 元数据。
- IoC 思想。
- DI 的实现。
@Injectable()
class AppService {
  private _count: number = 0
  constructor() {
    console.log('service init')
  }
  public async login(name: string, pwd: string) {
    if (name === 'error') {
      return this.notFound()
    }
    return (name === 'test' && pwd === '123')
  }
  public count() {
    return this._count++
  }
  public notFound() {
    throw new NotFoundError('Not Found User!')
  }
}
@Controller('user')
class AppController {
  constructor(
    private readonly service: AppService,
  ) {
    console.log('init', service)
  }
  @Get('home')
  public Home() {
    return {
      code: 200,
      data: 'home'
    }
  }
  @Get('not-found')
  @NotFound()
  public async NotFound() {
    return {
      code: 200,
      data: null,
      msg: 'not found'
    }
  }
  @Get('login')
  public async Login(
    @Param('name') name: string,
    @Param('pwd') pwd: string
  ) {
    return this.service.login(name, pwd).then(pass => {
      return {
        code: 200,
        data: 'login',
        count: this.service.count(),
        msg: pass ? 'success' : 'failure'
      }
    })
  }
}
@Controller('user')
class UserController {
  constructor(
    private readonly service: AppService
  ) {
    console.log('init', service)
  }
  @Get('test')
  public test() {
    return {
      count: this.service.count()
    }
  }
  @Get('test-error')
  public testError() {
    return this.service.notFound()
  }
}
@Module({
  controllers: [AppController, UserController],
  providers: [AppService]
})
class AppModule {}
const boostrap = () => {
  const app = new AppFactory(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