看完koa、express及其衍生框架,发现NodeJsweb开发框架似乎无法跳出固定模式。这个问题同样困扰着PHP,那就是注解能不能用来简化开发呢?其实PHP是有“注解”的,不过是通过反射读取注解实现的,很底层。今天要说的是一个划时代的NodeJsWeb框架——nestjs示例代码在介绍nestjs之前,先让大家看一下nestjs的示例代码。HTTP接口@Controller('socket')@UseGuards(AdminGuard)exportclassSocketController{privatelogger:Logger=newLogger(SocketController.name);构造函数(私有只读网关:SocketGateway,私有只读销售员服务:SalesmanService,私有只读hashidService:HashidService){}@Post('interaction')异步发送(@Query('salesman_id')salesmanId:数字,@Query('user_id')userId:number,@Body('content')content:string){if(!salesmanId||!userId||!content){thrownewBadRequestException('BadRequest');}constsalesman=awaitthis.salesmanService.findById(salesmanId);if(!salesman){thrownewNotFoundException('销售不存在');}constroomId=this.salesmanService.makeSyncRoomKey(salesman);this.gateway.namespace.to(roomId).emit(SocketEvent.OnInteraction,{user_id:this.hashidService.encode(userId),content});返回{errmsg:'ok',errcode:0};}}Socket.IO@UseFilters(newWsExceptionFilter())@WebSocketGateway({namespace:'socket',adapter:adapter(appConfig.redis)})导出类SocketGateway实现OnGatewayInit,OnGatewayConnection{privatelogger:Logger=新记录器(SocketGateway.name);@WebSocketServer()公共只读命名空间:SocketIO.Namespace;公共适配器:adapter.RedisAdapter;构造函数(私有只读销售员服务:SalesmanService,私有只读公司服务:CorporationService,私有只读hashidService:HashidService,私有只读用户服务:UserService,私有只读roomService:RoomService,私有只读消息服务:MessageService,私有只读只读服务:ReadService,私有只读成员服务:MemberService,){}afterInit(server:SocketIO.Namespace):any{this.adapter=server.adapterasadapter.RedisAdapter;this.logger.log(`初始化${s服务器名称}`);}/***进入聊天室*@param{SocketIO.Socket}client*@returns{any}*/asynchandleConnection(client:SocketIO.Socket):Promise{const{user_id,token,corporation_id,sign}=qs.parse(url.parse(client.request.url).query)as{[name:string]:string;};如果(!user_id&&!token&&!corporation_id&&!sign){client.disconnect(true);返回;}constrealUserId=this.hashidService.decode(user_id);等待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){returnthis.handleJoinChat(client,data);}if(JoinType.Sync===data.type){returnthis.handleJoinSync(client,data);}client.disconnect(true);}@SubscribeMessage(SocketEvent.Leave)asynchandleLeave(client:SocketIO.Socket,data:any){const{user_id,token,corporation_id,sign}=qs.parse(url.parse(client.request.url).query)as{[name:string]:细绳;};if(JoinType.Chat===data.type){awaitpromisify(client.leave.bind(client))(data.room_id);返回{事件:SocketEvent.Leave,数据};}constisPersonal=user_id&&token;constroomId=isPersonal?awaitthis.salesmanService.getRoomId(user_id,token):awaitthis.corporationService.getRoomId(corporation_id,sign);if(roomId){awaitpromisify(client.leave).bind(client)(roomId);}返回{事件:SocketEvent.Leave,数据};}//...写法是不是很像Java?还是Angular4?介绍其实nestjs的架构是从java的spring框架衍生出来的,代码组织开始开发yarnglobaladd@nestjs/clinestnewprojectNamecdprojectName&&yarnstart参考了Angular4的Modulenestjs模块架构图。限于篇幅,nestjs的详细文档可以到官网查看。世界之门。