이 기사는 사람들에게 적합합니다
특정 기초를 갖춘 Node.js 개발자
有一定基础的Node.js开发人员
难易程度
中等
背景
今天来谈谈node后端中路由的问题。【相关教程推荐:nodejs视频教程】
我们前端同学或者是nodejs服务端的同学,在你们使用express和koajs写接口的时候, 咱们是不都要写路由 比如如下
登录接口router.post('/user/login', user.login);
获取用户信息接口router.get('/user/info', checkAuth, user.xxx);
난이도
Medium
오늘은 노드 백엔드의 라우팅 문제에 대해 이야기해 보겠습니다. [추천 관련 튜토리얼: nodejs 동영상 튜토리얼]
프론트엔드 급우 또는 동급생 nodejs 서버, express 및 koajs를 사용하여 인터페이스를 작성할 때 다음과 같은 경로를 작성할 필요가 없습니다.Login 인터페이스router.post('/user/login', user.login);<p></p> 사용자 정보 가져오기 인터페이스 <code>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个
write 1,000개의 인터페이스를 router.js에 1,000번 등록해야 하나요? eggjs 경로 등록 예시
'use strict'; // egg-router extends koa-router import { 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); };**이러한 프로젝트가 확장되면 이 구성이 매우 중복될 것으로 생각하므로 이를 개선하고 최적화하기 위해 경로 자동 로딩 메커니즘을 구현해야 합니다. 2. 더 품격 있는 글쓰기
공통 경로 자동 로딩
연락을 해보니 여러 가지 방법으로 경로 자동 로딩을 구현하는 프레임워크가 있다는 것을 알게 되었습니다.
1. Think 시리즈Admin/adList/index
첫 번째는 thinkPHP와 thinkjs, 참조 링크는 thinkjs.org/zh-cn/doc/3…
둘의 관계는 thinkjs와 이후의 thinkPHP에 속합니다. 설계 및 개발되었습니다.
다른 두 경로의 자동 로딩은 파일 기반이므로 컨트롤러 이름과 메서드 이름을 작성한 후 추가 구성 없이 경로에 직접 액세스할 수 있습니다.1.thinkphp의 경로가 자동으로 로드됩니다
tp가 모듈/컨트롤러/메소드 파일 이름에 따라 자동으로 로드됩니다
module?/controller/Action
예를 들어 아래 Admin 모듈 아래에는 AdlistController.class.php의 index 메소드가 있습니다.
그의 경로는
2로 자동 로드되고, thinkjs 경로는 자동으로 로드됩니다.
컨트롤러 파일 파일 자동 로딩 로직
1), 애플리케이션 초기화, 인스턴스 생성 控制器匹配部分
是在当请求进来的时候做的事情。
就是当请求进来,会先进过,think-router 把module, controller, action ,解析出来挂在ctx上。
在这里拿ctx上本次请求的module, controller, action去和启动时挂在app的 module, controller, action,列表去匹配, 如果有就执行。
think-controller的匹配逻辑详见 github.com/thinkjs/thi…
thinkjs和koa-router路由匹配的区别
1、 think think-router解析完, think-controller去匹配执行, 他这个是动态匹配。
2、koa-router 匹配到路由后, 自己再用koa-compose组装一个小洋葱圈去执行
! 这种我的理解是程序启动就注册好的顺序image.png
总结:thinkjs是先把你的控制器和方法加载出来, 最后当请求进来的时候,利用think-controller
....
2 ) , 컨트롤러 디렉터리를 탐색하고 컨트롤러를 로드하고 디렉터리 파일 에 해당하는 내보낸 클래스의 맵을 가져옵니다. 예를 들어 Controller 디렉터리에서 그는 모듈, 컨트롤러 및 메서드를 로드하고 이를 앱에 걸어둘 것입니다.
{
'/order': [class default_1 extends default_1],
'/user': [class default_1 extends default_1]
}
컨트롤러 매칭 부분
단계가 완료됩니다. 🎜🎜즉, 요청이 들어오면 Think-router가 모듈, 컨트롤러, 액션을 구문 분석하여 ctx에 정지시킵니다. 🎜🎜여기서 이 요청의 모듈, 컨트롤러, 액션을 ctx에서 가져와서 시작 시 앱에 걸려 있는 모듈, 컨트롤러, 액션, 목록과 일치시키면 실행하세요. 🎜🎜think-controller의 매칭 로직은 github.com/thinkjs/thi…🎜🎜🎜thinkjs와 koa-router 경로 매칭의 차이점🎜
🎜1. think think-router 분석 그 후 think-controller는 동적 매칭인 매칭을 수행한다. 🎜2.koa-router가 경로를 일치시킨 후 koa-compose를 사용하여 실행을 위한 작은 양파링을 조립할 수 있습니다🎜! 프로그램이 시작될 때 주문이 등록되는 것으로 알고 있습니다. image.png🎜🎜🎜think-controller
를 사용하여 먼저 모듈/컨트롤러를 일치시킨 다음 메소드가 있으면 자동으로 실행됩니다. 404🎜🎜🎜🎜 2. egg의 수정 버전을 예로 들면, 데코레이터의 경로가 자동으로 로드됩니다🎜🎜🎜🎜🎜데코레이터의 작성 방법은 자바 스프링의 Annotation과 유사합니다🎜🎜node框架中 nestjs
和midwayjs
已经全面拥抱了装饰器路由。
- 写法比较优雅
- 建议控制器的文件名和控制器名字保持一致, 这样你找api也比较好找
比如控制的文件名字叫
home.ts
, 那你控制器注册也写@controller('/home')
来保持一致。
1、 控制器装饰器 @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> {} }</void>
2、方法装饰器 @Get('/export')、 @Post('/list')
get接口 就是 @Get()
post的接口 就是 @Post()
@Get("/") public async index(): Promise<void> {} @Post("/update") public async update(): Promise<void> {}</void></void>
3、装饰器路由统一注册
这里统一按egg的方法循环注册路由
'use strict'; import { Application, Context } from 'egg'; import 'reflect-metadata'; const CONTROLLER_PREFIX: string = ''; const methodMap: Map<string> = new Map<string>(); const rootApiPath: string = ''; interface CurController { pathName: string; fullPath: string; } /** * controller 装饰器,设置api公共前缀 * @param pathPrefix {string} * @constructor */ 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); }); };</any></any></string></string>
建议使用node写服务直接上midwayjs或者nestjs
总结
通过如上比较,相信你对think系列框架堵文件的路由自动加载和装饰器的路由加载,有了一定了解, 他们的这种设计思想值得学习吧
, 希望对你有所启发。
还有我认为装饰器的路由写起来,比较优雅, 不知道各位小伙伴怎么看,评论区说说?
更多node相关知识,请访问:nodejs 教程!
위 내용은 node.js의 백엔드 경로 자동 로딩에 대한 간략한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

각각의 엔진의 구현 원리 및 최적화 전략이 다르기 때문에 JavaScript 엔진은 JavaScript 코드를 구문 분석하고 실행할 때 다른 영향을 미칩니다. 1. 어휘 분석 : 소스 코드를 어휘 단위로 변환합니다. 2. 문법 분석 : 추상 구문 트리를 생성합니다. 3. 최적화 및 컴파일 : JIT 컴파일러를 통해 기계 코드를 생성합니다. 4. 실행 : 기계 코드를 실행하십시오. V8 엔진은 즉각적인 컴파일 및 숨겨진 클래스를 통해 최적화하여 Spidermonkey는 유형 추론 시스템을 사용하여 동일한 코드에서 성능이 다른 성능을 제공합니다.

실제 세계에서 JavaScript의 응용 프로그램에는 서버 측 프로그래밍, 모바일 애플리케이션 개발 및 사물 인터넷 제어가 포함됩니다. 1. 서버 측 프로그래밍은 Node.js를 통해 실현되며 동시 요청 처리에 적합합니다. 2. 모바일 애플리케이션 개발은 재교육을 통해 수행되며 크로스 플랫폼 배포를 지원합니다. 3. Johnny-Five 라이브러리를 통한 IoT 장치 제어에 사용되며 하드웨어 상호 작용에 적합합니다.

일상적인 기술 도구를 사용하여 기능적 다중 테넌트 SaaS 응용 프로그램 (Edtech 앱)을 구축했으며 동일한 작업을 수행 할 수 있습니다. 먼저, 다중 테넌트 SaaS 응용 프로그램은 무엇입니까? 멀티 테넌트 SAAS 응용 프로그램은 노래에서 여러 고객에게 서비스를 제공 할 수 있습니다.

이 기사에서는 Contrim에 의해 확보 된 백엔드와의 프론트 엔드 통합을 보여 주며 Next.js를 사용하여 기능적인 Edtech SaaS 응용 프로그램을 구축합니다. Frontend는 UI 가시성을 제어하기 위해 사용자 권한을 가져오고 API가 역할 기반을 준수하도록합니다.

JavaScript는 현대 웹 개발의 핵심 언어이며 다양성과 유연성에 널리 사용됩니다. 1) 프론트 엔드 개발 : DOM 운영 및 최신 프레임 워크 (예 : React, Vue.js, Angular)를 통해 동적 웹 페이지 및 단일 페이지 응용 프로그램을 구축합니다. 2) 서버 측 개발 : Node.js는 비 차단 I/O 모델을 사용하여 높은 동시성 및 실시간 응용 프로그램을 처리합니다. 3) 모바일 및 데스크탑 애플리케이션 개발 : 크로스 플랫폼 개발은 개발 효율을 향상시키기 위해 반응 및 전자를 통해 실현됩니다.

JavaScript의 최신 트렌드에는 Typescript의 Rise, 현대 프레임 워크 및 라이브러리의 인기 및 WebAssembly의 적용이 포함됩니다. 향후 전망은보다 강력한 유형 시스템, 서버 측 JavaScript 개발, 인공 지능 및 기계 학습의 확장, IoT 및 Edge 컴퓨팅의 잠재력을 포함합니다.

JavaScript는 현대 웹 개발의 초석이며 주요 기능에는 이벤트 중심 프로그래밍, 동적 컨텐츠 생성 및 비동기 프로그래밍이 포함됩니다. 1) 이벤트 중심 프로그래밍을 사용하면 사용자 작업에 따라 웹 페이지가 동적으로 변경 될 수 있습니다. 2) 동적 컨텐츠 생성을 사용하면 조건에 따라 페이지 컨텐츠를 조정할 수 있습니다. 3) 비동기 프로그래밍은 사용자 인터페이스가 차단되지 않도록합니다. JavaScript는 웹 상호 작용, 단일 페이지 응용 프로그램 및 서버 측 개발에 널리 사용되며 사용자 경험 및 크로스 플랫폼 개발의 유연성을 크게 향상시킵니다.

Python은 데이터 과학 및 기계 학습에 더 적합한 반면 JavaScript는 프론트 엔드 및 풀 스택 개발에 더 적합합니다. 1. Python은 간결한 구문 및 풍부한 라이브러리 생태계로 유명하며 데이터 분석 및 웹 개발에 적합합니다. 2. JavaScript는 프론트 엔드 개발의 핵심입니다. Node.js는 서버 측 프로그래밍을 지원하며 풀 스택 개발에 적합합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

WebStorm Mac 버전
유용한 JavaScript 개발 도구

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

Dreamweaver Mac版
시각적 웹 개발 도구

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기
