node后端路由自动加载怎么实现


这篇文章主要介绍“node后端路由自动加载怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“node后端路由自动加载怎么实现”文章能帮助大家解决问题。 今天来谈谈node后端中路由的问题。我们前端同学或者是nodejs服务端的同学,在你们使用express和koajs写接口的时候, 咱们是不都要写路由 比如如下登录接口router.post('/user/login', user.login);获取用户信息接口router.get('/user/info', checkAuth, user.xxx);这种写法很常见, 先注册路由,再指定后续要执行的中间件方法。可是当接口越来越多,比如有1000个接口, 就得这样注册1000次,多了我认为是一件很麻烦且不优雅的事情koa&express 路由注册示例

constexpress=require('express');
constrouter=express.Router();
constuser=require('../../controllers/user');
consttokenCheck=require('../../middleware/token_check_api');

//用户注册
router.post('/user/register',user.register);
//用户登录
router.post('/user/login',user.login);
router.post('xxx',tokenCheck,user.xxx);
...假装还有有1000个

写1000个接口就要在router.js里注册1000次吗?eggjs路由注册示例

'usestrict';

//egg-routerextendskoa-router

import{Application}from'egg';

exportdefault(app:Application)=>{
const{router,controller,middleware}=app;
router.get('/',middleware.special(),controller.home.index);
router.get('/1',middleware.special(),controller.home.index1);
....
router.get('/error',controller.home.error);
};

**这种项目扩大时候, 我认为这种配置会显得很冗余,所以就需要实现一种路由自动加载的机制来改善它优化它。1、提升效率2、更优雅的编写接触下来, 我发现有几个框架用不同方法实现了路由自动加载。一、think系列第一个是thinkPHP和thinkjs, 参考链接 thinkjs.org/zh-cn/doc/3…他两的关系属于是thinkjs是后来按照thinkPHP的思想设计开发的。他两路由自动加载属于基于文件的, 就是说你按控制器的名字和方法名写好,直接就可以访问路由,不需要额外的配置。1、thinkphp的路由自动加载tp是 按模块/控制器/方法文件名 自动加载

module?/controller/Action

比方下面这个Admin模块下, AdlistController.class.php里 index方法
他的路由就会自动加载为 Admin/adList/index2、thinkjs的路由自动加载控制器文件文件自动加载逻辑1)、应用初始化,创建实例
….2)、遍历控制器目录, 加载控制器得到目录文件对应的导出class的 Map
例如 Controller目录下
他会加载出来模块、控制器、方法挂在他的app上。

{
'/order':[classdefault_1extendsdefault_1],
'/user':[classdefault_1extendsdefault_1]
}

3、控制器匹配部分上一步是在thinkjs应用启动阶段做的事情。这一步 控制器匹配部分 是在当请求进来的时候做的事情。就是当请求进来,会先进过,think-router 把module, controller, action ,解析出来挂在ctx上。在这里拿ctx上本次请求的module, controller, action去和启动时挂在app的 module, controller, action,列表去匹配, 如果有就执行。think-controller的匹配逻辑详见 github.com/thinkjs/thi…1、 think think-router解析完, think-controller去匹配执行, 他这个是动态匹配。
2、koa-router 匹配到路由后, 自己再用koa-compose组装一个小洋葱圈去执行
! 这种我的理解是程序启动就注册好的顺序image.png总结:thinkjs是先把你的控制器和方法加载出来, 最后当请求进来的时候,利用think-controller 去先匹配模块/控制器,再匹配方法, 如果有的话就帮你执行,没有的话,就404二、以egg改造版为例 装饰器的路由自动加载装饰器的写法类似于 java spring中的注解node框架中 nestjsmidwayjs已经全面拥抱了装饰器路由。写法比较优雅建议控制器的文件名和控制器名字保持一致, 这样你找api也比较好找
比如控制的文件名字叫 home.ts ,
那你控制器注册也写 @controller('/home') 来保持一致。1、 控制器装饰器 @controller(‘/order’)

'usestrict';

import{Context}from'egg';
importBaseControllerfrom'./base';
import{formatDate}from'~/app/lib/utils';
import{SelfController,Get}from'./../router'

@SelfController('/home')
exportdefaultclassHomeControllerextendsBaseController{
[x:string]:any;
@validate()
@Get("/")
publicasyncindex():Promise{}

}

2、方法装饰器 @Get(‘/export’)、 @Post(‘/list’)get接口 就是 @Get()post的接口 就是 @Post()

@Get("/")
publicasyncindex():Promise{}

@Post("/update")
publicasyncupdate():Promise{}

3、装饰器路由统一注册这里统一按egg的方法循环注册路由

'usestrict';

import{Application,Context}from'egg';
import'reflect-metadata';

constCONTROLLER_PREFIX:string='';
constmethodMap:Map=newMap();
constrootApiPath:string='';

interfaceCurController{
pathName:string;
fullPath:string;
}

/**
*controller装饰器,设置api公共前缀
*@parampathPrefix{string}
*@constructor
*/
exportconstSelfController=(pathPrefix?:string):ClassDecorator=>(targetClass):void=>{
//在controller上定义pathPrefix的元数据
//https://github.com/rbuckton/reflect-metadata

(Reflectasany).defineMetadata(CONTROLLER_PREFIX,pathPrefix,targetClass);
};

constmethodWrap=(path:string,requestMethod:string):MethodDecorator=>(target,methodName):void=>{
//路由装饰器参数为空时,路由为方法名
constkey=path?`${requestMethod}${path}${String(methodName)}`:`${requestMethod}${String(methodName)}/${String(methodName)}`;
methodMap.set(key,target);
};

//Post请求
exportconstPost=(path:string=''):MethodDecorator=>methodWrap(path,'post');

//Get请求
exportconstGet=(path:string=''):MethodDecorator=>methodWrap(path,'get');

exportdefault(app:Application):void=>{
const{router}=app;
//遍历methodMap,注册路由
methodMap.forEach((curController:CurController,configString:string)=>{
//请求方法,请求路径,方法名
const[requestMethod,path,methodName]=configString.split(``);
//获取controller装饰器设置的公共前缀
//如果controller没有添加SelfController装饰器,则取文件名作为路径
letcontrollerPrefix:string|undefined|null=(Reflectasany).getMetadata(CONTROLLER_PREFIX,curController.constructor);
if(!(Reflectasany).hasMetadata(CONTROLLER_PREFIX,curController.constructor)){
controllerPrefix=`/${curController.pathName.split(`.`).reverse()[0]}`;
}
constfunc:(this:Context,...args:any[])=>Promise=asyncfunction(...args:any[]):Promise{
returnnew(curController.constructorasany)(this)[methodName](...args);
};
//注册路由
router[requestMethod](rootApiPath+免费云主机域名controllerPrefix+path,func);
});
};

建议使用node写服务直接上midwayjs或者nestjs。关于“node后端路由自动加载怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注百云主机行业资讯频道,小编每天都会为大家更新不同的知识点。

相关推荐: html5 input禁止输入如何实现

这篇“html5 input禁止输入如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“html5 input禁止输入如何实现”文章吧。 ht…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/09 09:33
下一篇 03/09 09:34

相关推荐