广告
返回顶部
首页 > 资讯 > 精选 >node后端路由自动加载怎么实现
  • 716
分享到

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

2023-07-05 00:07:36 716人浏览 独家记忆
摘要

这篇文章主要介绍“node后端路由自动加载怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“node后端路由自动加载怎么实现”文章能帮助大家解决问题。背景今天来谈谈node后端中路由的问题。我们

这篇文章主要介绍“node后端路由自动加载怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“node后端路由自动加载怎么实现”文章能帮助大家解决问题。

背景

今天来谈谈node后端中路由的问题。

我们前端同学或者是nodejs服务端的同学,在你们使用express和koajs写接口的时候, 咱们是不都要写路由 比如如下

登录接口router.post('/user/login', user.login);

获取用户信息接口router.get('/user/info', checkAuth, user.xxx);

这种写法很常见, 先注册路由,再指定后续要执行的中间件方法。

可是当接口越来越多,比如有1000个接口, 就得这样注册1000次,多了我认为是一件很麻烦且不优雅的事情

koa&express 路由注册示例

const express = require('express');const router = express.Router();const user = require('../../controllers/user');const tokenCheck = 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路由注册示例

'use strict';// egg-router extends koa-routerimport { Application } from 'egg';export default (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);};

**这种项目扩大时候, 我认为这种配置会显得很冗余,所以就需要实现一种路由自动加载的机制来改善它优化它。

提升效率

更优雅的编写

常见的路由自动加载

接触下来, 我发现有几个框架用不同方法实现了路由自动加载。

一、think系列

第一个是thinkPHP和thinkjs, 参考链接 thinkjs.org/zh-cn/doc/3…

他两的关系属于是thinkjs是后来按照thinkphp的思想设计开发的。

他两路由自动加载属于基于文件的, 就是说你按控制器的名字和方法名写好,直接就可以访问路由,不需要额外的配置。

1、thinkphp的路由自动加载

tp是 按模块/控制器/方法文件名 自动加载

module?/controller/Action

比方下面这个Admin模块下, AdlistController.class.php里 index方法他的路由就会自动加载为 Admin/adList/index

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

2、thinkjs的路由自动加载

控制器文件文件自动加载逻辑

1)、应用初始化,创建实例
....

2)、遍历控制器目录, 加载控制器

得到目录文件对应的导出class的 Map
例如 Controller目录下他会加载出来模块、控制器、方法挂在他的app上。

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

{  '/order': [class default_1 extends default_1],  '/user': [class default_1 extends default_1]}

3、控制器匹配部分

上一步是在thinkjs应用启动阶段做的事情。

这一步 控制器匹配部分 是在当请求进来的时候做的事情。

就是当请求进来,会先进过,think-router 把module, controller, action ,解析出来挂在ctx上。

在这里拿ctx上本次请求的module, controller, action去和启动时挂在app的 module, controller, action,列表去匹配, 如果有就执行。

think-controller的匹配逻辑详见 GitHub.com/thinkjs/thi…

thinkjs和koa-router路由匹配的区别

think  think-router解析完, think-controller去匹配执行, 他这个是动态匹配。
2、koa-router 匹配到路由后, 自己再用koa-compose组装一个小洋葱圈去执行
! 这种我的理解是程序启动就注册好的顺序image.png

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

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

总结:thinkjs是先把你的控制器和方法加载出来, 最后当请求进来的时候,利用think-controller 去先匹配模块/控制器,再匹配方法, 如果有的话就帮你执行,没有的话,就404

二、以egg改造版为例 装饰器的路由自动加载

装饰器的写法类似于 java spring中的注解

node框架中 nestjsmidwayjs已经全面拥抱了装饰器路由。

  • 写法比较优雅

  • 建议控制器的文件名和控制器名字保持一致, 这样你找api也比较好找比如控制的文件名字叫 home.ts ,那你控制器注册也写 @controller('/home') 来保持一致。

控制器装饰器 @controller('/order')

'use strict';import { Context } from 'egg';import BaseController from './base';import { fORMatDate } from '~/app/lib/utils';import { SelfController, Get } from './../router'@SelfController('/home')export default class HomeController extends BaseController {  [x: string]: any;  @validate()  @Get("/")  public async index(): Promise<void> {}  }

方法装饰器 @Get('/export')、 @Post('/list')

get接口 就是 @Get()

post的接口 就是 @Post()

  @Get("/")  public async index(): Promise<void> {}  @Post("/update")  public async update(): Promise<void> {}

装饰器路由统一注册

这里统一按egg的方法循环注册路由

'use strict';import { Application, Context } from 'egg';import 'reflect-metadata';const CONTROLLER_PREFIX: string = '';const methodMap: Map<string, any> = new Map<string, any>();const rootApiPath: string = '';interface CurController {  pathName: string;  fullPath: string;}export const SelfController = (pathPrefix?: string): ClassDecorator => (targetClass): void => {  // 在controller上定义pathPrefix的元数据  // https://github.com/rbuckton/reflect-metadata  (Reflect as any).defineMetadata(CONTROLLER_PREFIX, pathPrefix, targetClass);};const methodWrap = (path: string, requestMethod: string): MethodDecorator => (target, methodName): void => {  // 路由装饰器参数为空时,路由为方法名  const key = path ? `${requestMethod}·${path}·${String(methodName)}` : `${requestMethod}·${String(methodName)}·/${String(methodName)}`;  methodMap.set(key, target);};// Post 请求export const Post = (path: string = ''): MethodDecorator => methodWrap(path, 'post');// Get 请求export const Get = (path: string = ''): MethodDecorator => methodWrap(path, 'get');export default (app: Application): void => {  const { router } = app;  // 遍历methodMap, 注册路由  methodMap.forEach((curController: CurController, configString: string) => {    // 请求方法, 请求路径, 方法名     const [ requestMethod, path, methodName ] = configString.split(`·`);    // 获取controller装饰器设置的公共前缀    // 如果controller没有添加SelfController装饰器,则取文件名作为路径    let controllerPrefix: string | undefined | null = (Reflect as any).getMetadata(CONTROLLER_PREFIX, curController.constructor);    if (!(Reflect as any).hasMetadata(CONTROLLER_PREFIX, curController.constructor)) {      controllerPrefix = `/${curController.pathName.split(`.`).reverse()[0]}`;    }    const func: (this: Context, ...args: any[]) => Promise<any> = async function (...args: any[]): Promise<any> {      return new (curController.constructor as any)(this)[methodName](...args);    };    // 注册路由    router[requestMethod](rootApiPath + controllerPrefix + path, func);  });};

建议使用node写服务直接上midwayjs或者nestjs。

关于“node后端路由自动加载怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: node后端路由自动加载怎么实现

本文链接: https://www.lsjlt.com/news/348802.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • node后端路由自动加载怎么实现
    这篇文章主要介绍“node后端路由自动加载怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“node后端路由自动加载怎么实现”文章能帮助大家解决问题。背景今天来谈谈node后端中路由的问题。我们...
    99+
    2023-07-05
  • VUE中怎么实现路由动态加载
    VUE中怎么实现路由动态加载,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先新建vue工程,一般我们不会特殊处理路由,但当项目页面越来越多,...
    99+
    2022-10-19
  • vue怎么实现路由懒加载
    这篇文章主要介绍了vue怎么实现路由懒加载,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。路由懒加载写法: // 我所采用...
    99+
    2022-10-19
  • React中怎么动态加载路由
    React中怎么动态加载路由,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。引入必要的依赖import React&n...
    99+
    2022-10-19
  • el-menu动态加载路由的实现
    先看需要实现的效果 这里有一级也有二级菜单,注意二级菜单的父目录(”选项设置“点击不会跳转,只是展开目录),然后点击去详情页,需要跳到一个隐藏的路由,不在菜...
    99+
    2023-05-15
    el-menu动态加载路由 el-menu动态路由
  • VUE路由动态加载如何实现
    这篇文章主要讲解了“VUE路由动态加载如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“VUE路由动态加载如何实现”吧!首先新建vue工程,一般我们不会特殊处理路由,但当项目页面越来越多...
    99+
    2023-07-04
  • Vue中怎么实现自动化路由
    Vue中怎么实现自动化路由,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。为什么要自动化路由路由自动化在于解决以下的问题:每次新...
    99+
    2022-10-19
  • php怎么实现自动加载
    在PHP中,可以使用spl_autoload_register()函数实现自动加载。这个函数用于注册一个自定义的自动加载函数,当使用...
    99+
    2023-09-06
    php
  • Node怎么实现前后端数据传输加密解密
    今天小编给大家分享一下Node怎么实现前后端数据传输加密解密的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一...
    99+
    2022-10-19
  • Django3.2自动发现所有路由怎么实现
    这篇文章主要讲解了“Django3.2自动发现所有路由怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Django3.2自动发现所有路由怎么实现”吧!1.需求发现项目本地所有带别名的U...
    99+
    2023-06-21
  • Node中怎么实现前后端交互
    Node中怎么实现前后端交互,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。index.html:<!doctype> <...
    99+
    2022-10-19
  • 怎么在Vue中利用路由监听实现同页面动态加载
    怎么在Vue中利用路由监听实现同页面动态加载?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。watch: {   &nbs...
    99+
    2023-06-15
  • js怎么实现自定义路由
    这篇文章主要为大家展示了“js怎么实现自定义路由”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js怎么实现自定义路由”这篇文章吧。本文实现自定义路由,主要是事件...
    99+
    2022-10-19
  • vue前端路由机制怎么实现
    这篇文章主要讲解了“vue前端路由机制怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue前端路由机制怎么实现”吧!一. 前端路由现代前端开发中最流行的页面模型,莫过于SPA单页应用...
    99+
    2023-07-04
  • vue-router中怎么实现路由懒加载和权限控制
    今天就跟大家聊聊有关vue-router中怎么实现路由懒加载和权限控制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、为什么要使用路由懒加载呢用v...
    99+
    2022-10-19
  • Vue路由监听实现同页面动态加载的示例
    目录场景分析 开发 总结 场景分析 在系统中一个模块有三个子模块. 业务数据中可以直接根据类型去区分这个三个子模块的归属. 通常情况下.我们是写在同一个模块中然后去选择业务类型. ...
    99+
    2022-11-12
  • Vue路由传参加密怎么实现
    本篇内容介绍了“Vue路由传参加密怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先,创建一个base64.jsconst ...
    99+
    2023-07-04
  • 怎么用vue实现动态路由
    这篇文章主要介绍了怎么用vue实现动态路由的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用vue实现动态路由文章都会有所收获,下面我们一起来看看吧。1、什么是动态路由?动态路由,动态即不是写死的,是可变的。...
    99+
    2023-07-02
  • vue-router实现路由懒加载的方法是什么
    这篇文章主要讲解了“vue-router实现路由懒加载的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue-router实现路由懒加载的方法是什么”吧!在Web应用程序中,系统的...
    99+
    2023-07-04
  • Node中怎么实现自动化部署
    这期内容当中小编将会给大家带来有关Node中怎么实现自动化部署,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。配置脚本这段脚本内容是我们需要服务器自动执行的# a...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作