Skip to content

bwcxjs/bwcx

Repository files navigation

bwcx

轻量、渐进式、面向对象的 Node.js Web 框架。

参阅文档 以快速上手和查阅 API。

也可以直接使用下列功能强大的模板来创建项目:

基本安装

npm i -S bwcx-common bwcx-core bwcx-ljsm

特性概览

轻量的 OOP Web 开发

@Controller()
class HomeController {
  @Get('/')
  hello() {
    return { hello: 'bwcx' };
  }
}

class OurApp extends App {
  protected port = 3000;

  afterStart() {
    console.log(`🚀 A bwcx app is listening on http://localhost:${this.port}`);
  }
}

const app = new OurApp();
app.bootstrap().then(() => {
  app.start();
});

依赖注入

@Provide()
export default class MyService {
  @Inject()
  private formatUtil: FormatUtil;

  // 或使用构造器注入
  constructor(private formatUtil: FormatUtil) {}

  public getStr() {
    return this.formatUtil.formatString('foo');
  }
}

中间件

@Middleware()
export default class LogMiddleware implements IBwcxMiddleware {
  use(ctx: RequestContext, next: MiddlewareNext) {
    console.log(`req: ${ctx.url}`);
    return next();
  }
}

@Controller()
@UseMiddlewares(LogMiddleware) // 作用于全部路由
export default class HomeController {
  @Get('/')
  @UseMiddlewares(LogMiddleware) // 作用于单个路由
  hello() {
    return 'world';
  }
}

守卫

@Guard()
export default class RandomGuard implements IBwcxGuard {
  canPass(ctx: RequestContext) {
    return Math.random() < 0.5;
  }
}

@Controller()
@UseGuards(RandomGuard) // 作用于全部路由
export default class HomeController {
  @Get('/')
  @UseGuards(RandomGuard) // 作用于单个路由
  hello() {
    return 'world';
  }
}

异常处理

@ExceptionHandler(Exception)
export default class GlobalExceptionHandler implements IBwcxExceptionHandler {
  catch(error: Exception, ctx: RequestContext) {
    ctx.status = 500;
    ctx.body = {
      msg: 'Internal Server Error',
    };
  }
}

数据校验

export class UserDTO {
  @IsInt()
  userId: number;

  @Length(2, 20)
  username: string;
}

export class GetUsersReqDTO {
  @FromQuery()
  @IsInt()
  @Min(1)
  page: number;
}

export class GetUsersRespDTO {
  @Type(() => UserDTO)
  @ValidateNested()
  rows: UserDTO[];
}

@Controller('/user')
export default class UserController {
  @Get('/get')
  @Contract(GetUsersReqDTO, GetUsersRespDTO)
  getUsers(@Data() data: GetUsersReqDTO): Promise<GetUsersRespDTO> {
    return userService.getUsers(data);
  }
}

谁在使用

logo-wechat