第9节nodejs09手写ts装饰器项目架构_第1页
第9节nodejs09手写ts装饰器项目架构_第2页
第9节nodejs09手写ts装饰器项目架构_第3页
第9节nodejs09手写ts装饰器项目架构_第4页
第9节nodejs09手写ts装饰器项目架构_第5页
已阅读5页,还剩5页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ts项⽬架 搭建NodeTS开发环境基于装饰器的RouterValidationpackage.jsonnpminitnpmitypescriptts-node-devtslint@types/node启动"scripts":"scripts":"start":"ts-node-dev./src/index.ts-Ptsconfig.json--no-cache","build":"tsc-Ptsconfig.json&&node./dist/index.js","tslint":"tslint--fix-ptsconfig.json"}加⼊{{"compilerOptions":{"outDir":"target":"module""commonjs",//组织代码⽅式"sourceMap":true,"moduleResolution":"node",//模块解决策略"experimentalDecorators":true,//开启装饰器定义"allowSyntheticDefaultImports"true允许es6⽅式import"lib":"typeRoots":"include":}创建⼊⼝⽂件npmnpmikoakoa-statickoa-bodykoa-xtime编写基础代import*import*asKoafromimport*asbodifyfrom'koa-import*asservefrom'koa-static';import*astimingfrom'koa-constapp=newapp.use(serve(`${multipart:使⽤⾮严格模式,解析delete请求的请求strict:app.use((ctx:Koa.Context)=>{ctx.body=' app.listen(3000,()=>{npm创建路由import*import*asKoafromconstusers=[{name:'tom',age:20},{name:'tom',age:20}];exportdefaultclassUser{publiclist(ctx:{ctx.body={ok:1,data:users};publicadd(ctx:{;ctx.body={ok:1}}知识点补充:装饰器的编写,以@gt('/users')functionfunctionget(path)returnfunction(target,property,descriptor)}另外需解决两个问路由发路由路由发现及,创建./utils/route-importimport*asglobfrom'glob';import*asKoafrom'koa';import*asKoaRouterfrom'koa-typeHTTPMethod='get'|'put'|'del'|'post'|'patch';typeLoadOptions={*路由⽂件扩展名,默认值是extname?:typeRouteOptions=prefix?:middlewares?:constrouter=newexportconstget=(path:string,options?:RouteOptions){return(target,property,descriptor)=>consturl=options&&options.prefix?options.prefix+pathrouter['get'](url,}}exportconstpost=(path:string,options?:RouteOptions){return(target,property,descriptor)=>consturl=options&&options.prefix?options.prefix+pathrouter['post'](url,}}解决getpostputdelete⽅⽤逻辑constconstrouter=newconstmethod=method=>(path:string,options?:RouteOptions){return(target,property,descriptor)=>consturl=options&&options.prefix?options.prefix+pathrouter[method](url,}}exportconstget=method('get')exportconstpost=method('post')routerconstconstrouter=newconstdecorate=(method:HTTPMethod,path:string,options:RouteOptions{},router:KoaRouter)=>return(target,property:string)=>consturl=options.prefix?options.prefix+path:pathrouter[method](url,target[property])}}constmethod=method=>(path:string,options?:RouteOptions)=>decorate(method,path,options,router)exportconstget=exportconstpost=importimport*asglobfrom'glob';import*asKoafrom'koa';import*asKoaRouterfrom'koa-typeHTTPMethod='get'|'put'|'del'|'post'|'patch';typeLoadOptions={路由⽂件扩展名,默认值是extname?:typeRouteOptions=适⽤于某个请求⽐较特殊,需要单独制定前缀的prefix?:给当前路由添加⼀个或多个中middlewares?:constrouter=newconstdecorate=(method:HTTPMethod,path:string,options:RouteOptions{},router:KoaRouter)=>return(target,property:string)=>consturl=options.prefix?options.prefix+path:pathrouter[method](url,target[property])}}constmethod=method=>(path:string,options?:RouteOptions)=>decorate(method,path,options,router)exportconstget=exportexportconstpost=method('post')exportconstput=method('put')exportconstdel=method('del')exportconstpatch=exportconstload=(folder:string,options:LoadOptions={}):=>constextname=options.extname||'.{js,ts}'`./**/*${extname}`)).forEach((item)=>require(item))returnrouter}使importimport{get,post}fromimportimport{load}from'./utils/decors';import{resolve}from'path'constrouter=load(resolve(dirname,'./routes'));////异步校验constapi=findByName(name)returnnewPromise((resolve,reject){setTimeout(()=>if(name===}else}},}}exportdefaultclassUser添加中间件选{middlewares:asyncfunctionvalidation(ctx:Koa.Context,next:()=>Promise<any>){constname=if(!name){throw"请输⼊⽤户名}tryawaitawait}catch{throw}}]publicasyncadd(ctx:Koa.Context)}更新exportexportconstload=function(prefix:string,folder:string,options:LoadOptions={}):KoaRouter{//route=function(method:HTTPMethod,path:string,options:RouteOptions{})returnfunction(target,property:string,descriptor)添加中间件数constmiddlewares=若设置了中间件选项则加⼊到中间件if{}添加路由处理consturl=(options.prefix||prefix)+//router[method](url,target[property]);router[method](url,...middlewares);////return类级别路由使⽤asyncfunctionguard(ctx:Koa.Context,next:()Promise<any>){console.log('guard',if(ctx.header.token){awaitnext();}elsethrow }}exportdefaultclassUser////增加中间装饰exportconstmiddlewares=functionmiddlewares(middlewares:Koa.Middleware[]){return{totype.middlewares=//修改load⽅exportconstload=function(prefix:string,folder:string,options:LoadOptions={}):KoaRouter{route=function(method:HTTPMethod,path:string,options:RouteOptions={}){returnfunction(target,property:string,descriptor)//晚⼀拍执⾏路 :因为需要等类装饰器执⾏完process.nextTick((){letmws=获取class上定义的中间if{}//returnnpmiSsequelizesequelize-typescriptreflect-metadata初始化importimport{Sequelize}from'sequelize-constdatabase=newSequelize({modelPaths:[`${ :创建模////import{Table,Column,Model,DataType}from'sequelize-@Table({modelNam

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论