express 프레임 워 크 의 일치 경로 체 제 를 깊이 이해 하 다.
본 고 는 주로 express 의 기능 중 하 나 를 실현 하고 경로 와 일치 합 니 다.
간단 한 정적 경로 와 일치 합 니 다일치 하 는 동적 경로우선 express 를 살 펴 보 겠 습 니 다.
const express = require('express');
let app = new express();
app.get('/',(req,res)=>{
    res.end('home Page.');
});
app.get('/center',(req,res)=>{
    res.end('center Page.');
});
/**                   */
 app.get('/product/:id/:name',(req,res)=>{
     res.end(JSON.stringify(req.params));
 });
/**                 404 */
app.all('*',(req,res)=>{
    res.end('404');
});
let port = 3000;
app.listen(port,()=>{
    console.log(`Server is start on port ${port}`);
});  ok.코드 는 간단 합 니 다.express 를 도입 하여 new 는 express 인 스 턴 스 를 사용 하여 몇 가지 경 로 를 썼 고 마지막 으로 로 컬 서 비 스 를 시작 했다.
코드 두 번 째 줄 에서 우 리 는 도 입 된 express 를 new 에 게 보 내 서 express 내부 에서 하나의 function 으로 되 돌아 간 다 는 것 을 설명 합 니 다.
좋 습 니 다.참 새 는 작 지만 오장 이 모두 갖 추어 져 있 습 니 다.우 리 는 오늘 express 의 이러한 기능 을 실현 하 겠 습 니 다.
let http = require('http'); /** express  http */
let url = require('url'); /**           */
/** express   methods                */
let methods = require('methods');
function application(){
    /** 1 express        
     *       http.createServer     
    */
    let app = (req,res) => {
        /** 1.1 url               /user */
        let { pathname } = url.parse(req.url);
        /** 1.2                      */
        let requestMethod = req.method.toLowerCase();
        /** 1.3                       routes        */
        for(let i = 0; i < app.routes.length; i++){
            /** 1.4                      */
            let { path, method, cb } = app.routes[i];
            if((pathname===path||path==='*') && (requestMethod===method)||method==='all'){
                /** 1.5               */
                return cb(req,res);
            }
        }
        /** 1.6           */
        res.end(`Cannot found ${pathname}/${requestMethod}`);
    }
    /** 2               */
    app.routes = [];
    /** 2.1  methods          all        */
    [...methods,'all'].forEach((method)=>{
        app[method] = function(path,cb){
            /** 2.2                       
             * path:    method:     cb:  
            */
            let layer = { path, method, cb };
            app.routes.push(layer);
        }
    });
    /** 3      */
    app.listen = function(...arguments){
        /** 3.1   http createServer    app    */
        let server = http.createServer(app);
        server.listen(...arguments);
    }
    return app;
}
/** 4         */
module.exports = application;
  코드 위 에 관람 번호 가 자세히 표시 되 어 있 습 니 다.1,2,3.순서대로 보면 됩 니 다.
우리 가 손 으로 쓴 전체 express 는 하나의 함수 함수 안에 하나의 함 수 를 return 했다.node 네 이 티 브 프레임 http 방법 으로 이 함 수 를 포장 하고 마지막 으로 전체 함수 module.exports 를 내 보 냅 니 다.마지막 으로 프로젝트 를 시작 합 니 다.브 라 우 저 나 postman 호출 인 터 페 이 스 를 통 해 일부 express 기능 을 실현 할 수 있 음 을 발 견 했 습 니 다.그러나 한 가 지 는 이때 우리 가 실현 할 수 있 는 것 은 정적 인 경로 일 뿐 입 니 다.만약 에 경로 파라미터 가 있 으 면 예 를 들 어/produt/:id/:name 입 니 다.결 과 는 기대 에 부합 되 지 않 는 다.개조:
코드 위 에 관람 번호 가 자세히 표시 되 어 있 습 니 다.1,2,3.순서대로 보면 됩 니 다.
let http = require('http');
let url = require('url');
let methods = require('methods');
function application(){
    let app = (req,res) => {
        let { pathname } = url.parse(req.url);
        let requestMethod = req.method.toLowerCase();
        for(let i = 0; i < app.routes.length; i++){
            let { path, method, cb } = app.routes[i];
            /** 7       path             */
            if(path.params){
                /** 8                      true */
                if(path.test(pathname)){
                    /** 9                */
                    let [, ...otherParams] = pathname.match(path);
                    /** 10   reduce()               
                     *    req.params 
                     */
                    req.params = path.params.reduce(
                        (memo,key,index)=>(
                            memo[key]=otherParams[index],memo
                        ),{}
                    );
                    /** 11            */
                    return cb(req,res);
                }
            }
            if((pathname===path||path==='*') && (requestMethod===method)||method==='all'){
                return cb(req,res);
            }
        }
        res.end(`Cannot found ${pathname}/${requestMethod}`);
    }
    app.routes = [];
    [...methods,'all'].forEach((method)=>{
        app[method] = function(path,cb){
            let layer = { path, method, cb };
            /** 1                    */
            let params = [];
            /** 2        :            */
            if(path.includes(':')){
                /** 3           path        
                 *                               
                 */
                layer.path = new RegExp(path.replace(/:([^\/]*)/g,function(){
                    /** 4         key   params    */
                    params.push(arguments[1]);
                    /** 5                           : */
                    return '([^\/]*)';
                }));
                /** 6                 path params  */
                layer.path.params = params;
            }
            app.routes.push(layer);
        }
    });
    app.listen = function(...arguments){
        let server = http.createServer(app);
        server.listen(...arguments);
    }
    return app;
}
module.exports = application;
  먼저 이 동적 경로 에 정규 로 일치 하고 이 동적 경로 의 path 를 정규 로 바 꾸 어 배열 에 넣 고 진정한 동적 경로 가 오 기 를 기다 릴 때 경로 배열 에서 이 동적 경로 의 경 로 를 가 져 옵 니 다.즉,방금 교 체 된 정규 로 이 동적 경로 뒤의 매개 변 수 를 일치 시 키 면 됩 니 다.
이상 을 통 해 동적 경로 의 매개 변 수 를 얻 을 수 있 습 니 다.위의 그림:
코드 는 git mock-express 에 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Express + AWS S3 이미지 업로드하기웹 사이트 및 모바일 애플리케이션 등에서 원하는 양의 데이터를 저장하고 보호할 수 있다. 데이터에 대한 액세스를 최적화, 구조화 및 구성할 수 있는 관리 기능을 제공한다. AWS S3 에 저장된 객체에 대한 컨테이너...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.