博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NestJs简明教程
阅读量:6594 次
发布时间:2019-06-24

本文共 3943 字,大约阅读时间需要 13 分钟。

看遍了koa,express以及其衍生框架之后,发现NodeJs的Web开发框架似乎跳不出一个固定的模式,这个问题也困扰着PHP,那就是能不能通过注解来简化开发?

实际上PHP是有“注解”的,不过是通过反射读取注释实现,非常低级。
今天要讲的是一个划时代的NodeJs Web框架——

示例代码

在介绍nestjs之前,先让大家看一看nestjs的示例代码。

  1. HTTP接口
@Controller('socket')@UseGuards(AdminGuard)export class SocketController {  private logger: Logger = new Logger(SocketController.name);  constructor(private readonly gateway: SocketGateway,              private readonly salesmanService: SalesmanService,              private readonly hashidService: HashidService) {  }  @Post('interaction')  async send(@Query('salesman_id') salesmanId: number, @Query('user_id') userId: number, @Body('content') content: string) {    if (!salesmanId || !userId || !content) {      throw new BadRequestException('Bad Request');    }    const salesman = await this.salesmanService.findById(salesmanId);    if (!salesman) {      throw new NotFoundException('销售不存在');    }    const roomId = this.salesmanService.makeSyncRoomKey(salesman);    this.gateway.namespace.to(roomId).emit(SocketEvent.OnInteraction, { user_id: this.hashidService.encode(userId), content });    return { errmsg: 'ok', errcode: 0 };  }}
  1. Socket.IO
@UseFilters(new WsExceptionFilter())@WebSocketGateway({ namespace: 'socket', adapter: adapter(appConfig.redis) })export class SocketGateway implements OnGatewayInit
, OnGatewayConnection
{ private logger: Logger = new Logger(SocketGateway.name); @WebSocketServer() public readonly namespace: SocketIO.Namespace; public adapter: adapter.RedisAdapter; constructor( private readonly salesmanService: SalesmanService, private readonly corporationService: CorporationService, private readonly hashidService: HashidService, private readonly userService: UserService, private readonly roomService: RoomService, private readonly messageService: MessageService, private readonly readService: ReadService, private readonly memberService: MemberService, ) { } afterInit(server: SocketIO.Namespace): any { this.adapter = server.adapter as adapter.RedisAdapter; this.logger.log(`initialized ${server.name}`); } /** * 进入聊天室 * @param {SocketIO.Socket} client * @returns {any} */ async handleConnection(client: SocketIO.Socket): Promise
{ const { user_id, token, corporation_id, sign } = qs.parse(url.parse(client.request.url).query) as { [name: string]: string; }; if (!user_id && !token && !corporation_id && !sign) { client.disconnect(true); return; } const realUserId = this.hashidService.decode(user_id); await promisify(client.join.bind(client))(this.roomService.makePersonalRoomId(realUserId)), client.emit(SocketEvent.Ready); } @SubscribeMessage(SocketEvent.Join) handleJoin(client: SocketIO.Socket, data: any) { if (JoinType.Chat === data.type) { return this.handleJoinChat(client, data); } if (JoinType.Sync === data.type) { return this.handleJoinSync(client, data); } client.disconnect(true); } @SubscribeMessage(SocketEvent.Leave) async handleLeave(client: SocketIO.Socket, data: any) { const { user_id, token, corporation_id, sign } = qs.parse(url.parse(client.request.url).query) as { [name: string]: string; }; if (JoinType.Chat === data.type) { await promisify(client.leave.bind(client))(data.room_id); return { event: SocketEvent.Leave, data }; } const isPersonal = user_id && token; const roomId = isPersonal ? await this.salesmanService.getRoomId(user_id, token) : await this.corporationService.getRoomId(corporation_id, sign); if (roomId) { await promisify(client.leave).bind(client)(roomId); } return { event: SocketEvent.Leave, data }; }// ...

写法是不是很像Java?或者说是Angular4?

介绍

实际上nestjs的架构源自于java的spring框架,而代码组织则借鉴与Angular4的Module。

nestjs模块架构图

clipboard.png

开始开发

  1. yarn global add @nestjs/cli
  2. nest new projectName
  3. cd projectName && yarn start

写在最后

由于篇幅关系,nestjs的详细文档可以前往官网查看,本文只是做个框架介绍,开启新世界的大门。

转载地址:http://smcio.baihongyu.com/

你可能感兴趣的文章
【转】SQL Server 连接error: 40 - 无法打开到 SQL Server 的连接错误解决方案
查看>>
19.04.08-小练习
查看>>
ES6第二篇:变量的解构赋值
查看>>
关于C语言的问卷调查
查看>>
理解session 和 cookie 哦
查看>>
OK335xS EMMC Partition hacking
查看>>
三角形面积 蓝桥杯
查看>>
form的一个问题
查看>>
数据库操作
查看>>
samba介绍和安装
查看>>
利用JavaScript jQuery实现图片无限循环轮播(不借助于轮播插件)-----转载
查看>>
函数的原型对象和原型链?
查看>>
js中的面向对象
查看>>
050:navie时间和aware时间详解
查看>>
如何正确地在Spring Data JPA和Jackson中用上Java 8的时间相关API(即JSR 310也即java.time包下的众神器)...
查看>>
【python】-- 函数、无参/有参参数、全局变量/局部变量
查看>>
KMP算法(AC自动机前奏)(转)
查看>>
基于WinSvr2016(TP)构建的“超融合技术架构”进阶篇
查看>>
2013喜获MVP殊荣,这个国庆不一样
查看>>
CocoStudio 1.4.0.1数据编辑器使用
查看>>