>

디렉토리 및 서브 디렉토리에 특정 기준과 일치시키려는 json 파일이 있지만 서브 디렉토리에 대한 작업 방법을 인식하지 못합니다.

요구 사항 을 사용하여 json 파일을 찾습니다 :

const reqAll = require('require-all')({
  dirname: __dirname + '/resource',
  filter: /(.+)\.json$/,
  recursive: true
});

내 파일 트리는 다음과 같습니다 :

MyDir
- file1.json
- SubDir
-- file2.json

reqAll 인쇄  출력합니다 :

{ 
  file1: { 
    path: /first,
    body: ...some body
  },
  SubDir: { 
    file2: { 
      path: /second,
      body: ...some body
    } 
  } 
}


처음에는 서브 디렉토리를 사용하지 않았기 때문에 처음에는 다음 필터를 사용하여 데이터를 걸러 냈지만 이제는 의미가 있습니다.

let source = Object.values(reqAll).filter(r => {
    return r.path === req.url;
}

여기서 req.url  내가 보내는 http 요청의 URL입니다. 예 : localhost:8080/first 이것이 file1 와 일치하도록  내 디렉토리에있는 파일입니다.

문제는 내가 localhost:8080/second 를 제출하면 file2 와 일치 할 수 없기 때문에 응답이 없습니다.  이것은 하위 디렉토리 내에 있기 때문입니다. localhost:8080/SubDir/file2 도 보내기  작동하지 않습니다.

이 작업을 수행 할 수있는 방법이 있습니까?


  • 답변 # 1

    내가 작성한 의견 :

    와이즈 비즈

    그러려면

    So, I will perform a HTTP GET on, localhost:8080/first and it should return me the body of the file1 object. This does in fact work for this endpoint. However, it is when I perform a HTTP GET on localhost:8080/second that I cannot get the body back.

    가있는 항목을 재귀 적으로 검색해야합니다. , 다음 행을 따라야합니다 (의견 참조) :

    path
    
    
    const repAll = { 
        file1: { 
            path: "/first"
        },
        SubDir: { 
            file2: { 
                path: "/second"
            },
            SubSubDir: {
                file3: {
                    path: "/third"
                }
            }
        } 
    };
    const req = {};
    function findEntry(data, path) {
        for (const value of Object.values(data)) {
            // Is this a leaf node or a container?
            if (value.path) {
                // Leaf, return it if it's a match
                if (value.path === path) {
                    return value;
                }
            } else {
                // Container, look inside it recursively
                const entry = findEntry(value, path);
                if (entry) {
                    return entry;
                }
            }
        }
        return undefined; // Just to be explicit
    }
    for (const url of ["/first", "/second", "/third", "fourth"]) {
        req.url = url;
        console.log(req.url + ":", findEntry(repAll, req.url));
    }
    
    

    재귀가 계속 작동하는지 확인하기 위해 두 번째 하위 디렉토리를 추가했으며 일치하는 경로를 찾지 못하면 다시 얻는 예를 보여줍니다.

    물론 .as-console-wrapper { max-height: 100% !important; } 를 처리하여 맵을 만들 수 있습니다.  한 번 미리 본 다음지도를 재사용하면 선형 검색보다 빠릅니다.

    repAll
    
    
    const repAll = { 
        file1: { 
            path: "/first"
        },
        SubDir: { 
            file2: { 
                path: "/second"
            },
            SubSubDir: {
                file3: {
                    path: "/third"
                }
            }
        } 
    };
    const byPath = new Map();
    function indexEntries(map, data) {
        for (const value of Object.values(data)) {
            if (value) {
                // Leaf or container?
                if (value.path) {
                    map.set(value.path, value);
                } else {
                    indexEntries(map, value);
                }
            }
        }
    }
    indexEntries(byPath, repAll);
    const req = {};
    for (const url of ["/first", "/second", "/third", "fourth"]) {
        req.url = url;
        console.log(req.url + ":", byPath.get(req.url));
    }
    
    

    .as-console-wrapper { max-height: 100% !important; }

관련 자료

  • 이전 장고에서 숨은 참조와 참조로 이메일 보내기
  • 다음 c# - IQuerable 와 List 를 연결하는 방법