2014-11-26 3 views
1

모든 파일 (이름)을 디렉토리로 가져 오려고합니다. 나는 Node.js + Express을 사용합니다. 여기 익스프레스 코드가 있습니다 :Express를 사용하여 디렉토리 컨텐츠를 얻는 방법은 무엇입니까?

var express = require('express'); 
var fs = require('fs'); 
var path = require('path'); 
var router = express.Router(); 

router.get('/', function (req, res) { 
    var filePath = path.join(path.resolve(__dirname, '..'), '/public/images/'); 
    var directoryContent = []; 
    getDirectoryContent(filePath, directoryContent); 
    res.send(directoryContent); 
}); 

function getDirectoryContent(dir, arr) { 
    fs.readdir(dir, function (err, flist) { 
     if (err) { 
      return; 
     } 
     var elemNum = 0; 
     var processEntry = function (entry) { 
      arr.push(entry); 
      //console.log(entry); 
     }; 
     var dirIterator = function() { 
      processEntry(flist[elemNum]); 
      elemNum++; 
      if (elemNum < flist.length) { 
       process.nextTick(dirIterator); 
      } 
     }; 
     if (elemNum < flist.length) { 
      process.nextTick(dirIterator); 
     } 
    }); 
} 

module.exports = router; 

하지만 결과는 [] - 빈 배열입니다. 내가 뭘 잘못하고있어?

PS

이음새가 콜백 메커니즘에 있습니다. 조금 잘못 될 수 있습니다.

답변

3

디렉토리 읽기 작업의 비동기 성격을 존중하지 않습니다. fs.readdir는 비동기이며 "결국"당신의 처리 함수가 호출되는 원인이됩니다, 그래서 당신은 그것이 그렇게되면 작업을 재개 할 필요가 있다고 Node.js를 얘기해야 할거야 :

var express = require('express'); 
var router = express.Router(); 

var fs = require('fs'); 
var path = require('path'); 
var imagePath = path.join(path.resolve(__dirname, '..'), '/public/images/'); 

function getDirectoryContent(req, res, next) { 
    fs.readdir(imagePath , function (err, images) { 
    if (err) { return next(err); } 
    res.locals.filenames = images; 
    next(); 
    }); 
} 

router.get('/', getDirectoryContent, function(req, res) { 
    // build a response using res.locals.filenames here. 
    // just sending the names is silly, and so for demonstration only 
    res.send(res.locals.filenames); 
}); 

module.exports = router; 
  1. 당신을 한 번 경로를 캡처 할 수 있습니다. 결코 변하지 않을 것입니다.
  2. 함수가 적절한 미들웨어 기능을 나열하는 디렉토리를 얻을 수 있도록 : 필수/고해상도 다음에 이동/다음 일이 (잘못 다음에 갈 때 (ERR이)라고 함)를 잘
    1. 일을 갈 일이 갈 때 호출되는 dir을 잘못 읽을 때 오류가 있습니다.
    2. 우리가 dir을 읽을 수있게되면 바로 이동합니다. API는 '결과'가 파일 이름의 배열임을 알려줍니다. 우리는 그것들을 res.locals에 저장하고, express에서 그 경로의 다음 미들웨어 기능으로 이동하도록 지시합니다.
  3. 우리가 우리의 마지막 함수에 도달 (두 가지 기능의 영광스러운 체인이 경우에,하지만 체인이 쉽게 작업 당 하나 개의 기능으로 10 개 이상의 작업을 할 수있는 실제 응용 프로그램에서) 우리는 res.locals.filenames를 사용하여 결과를 생성 우리가 알고있는 것은 라우트 처리의이 부분에 도달하지 않았기 때문에 다음 (오류)가 발생하고 익스프레스가 대신 우리를 오류 처리기로 이동 시켰기 때문입니다.
0

문제는 fs.readdir 메서드가 비동기 작업이라는 점입니다. 실제로 콜백 함수를 해당 메서드에 전달하고 작업이 실행될 때까지 기다려야합니다.

작업이 끝나기 전에 응답을 플러시하기 때문에 지금은 비어 있습니다.

사용할 수 있습니다 fs.readdirSync 마녀는 동기 작업입니다. 결과는 파일의 배열입니다 (있는 경우). 오류가 발생하면 오류가 발생하므로 함수 내에서 오류를 catch해야합니다.

또는 같은 방법을 사용

router.get('/', function (req, res) { 
 
    var filePath = path.join(path.resolve(__dirname, '..'), '/public/images/'); 
 
    
 
    try { 
 
     var directoryContent = fs.readdirSync(filePath); 
 
     res.send(directoryContent); 
 
    } catch(e) { 
 
     next(e); 
 
    } 
 
    
 
});

,하지만 지금은 응답을 세척하기 전에 결과를 기다립니다.

router.get('/', function (req, res, next) { 
 
    var filePath = path.join(path.resolve(__dirname, '..'), '/public/images/'); 
 
    
 
    fs.readdir(dir, function (err, flist) { 
 
     if(err) return next(err); 
 
     
 
     res.send(flist); 
 
    }); 
 
    
 
});

관련 문제