본문 바로가기

문돌이 존버/Node.js 스터디

Node.js 파일 목록 불러오기 및 글 목록 출력 feat. 생활코딩

반응형
본 글은 생활코딩의 Node.js 강의를 보고 정리한 것입니다.

이번 시간엔 파일 하나를 읽어오는 것이 아니라 특정 폴더에 어떤 파일들이 있는지 불러오는 작업을 해보겠습니다.

기본 형식: fs.readdir(path, option, callback)
option: encoding / withFileTypes
callback: err / files
var testFolder = './data';
var fs = require('fs');

// directory 내부 파일들을 리스트 형태로 출력
fs.readdir(testFolder, (err, filelist) => {
    if (err) {
        console.log(err);
    } else {
        console.log(filelist);
    }
});

위에서 callback 함수 중 하나인 err가 어떻게 작동하는지 살펴보겠습니다. 일부러 없는 폴더를 입력하면 아래와 같은 에러 문구가 뜹니다.

읽어보니 입력한 경로로 스캔(scan)을 했지만 찾을 수 없다는 것이었고, 오류 번호는 -4058이었습니다.

생활코딩에선 아래와 같은 버전으로 코드를 소개하고 있습니다.

var testFolder = './data';
var fs = require('fs');
 
fs.readdir(testFolder, function(error, filelist){
  console.log(filelist);
})

지금까지 배운 내용을 중심으로 폴더 읽기 + 파일 목록 읽기 등을 사용하여 웹 페이지를 구성해보겠습니다.

var http = require('http');
var fs = require('fs');
var url = require('url');

var app = http.createServer(function(request, response) {
    var _url = request.url;
    var queryData = new URL('http://localhost:3000' + _url);
    var pathname = queryData.pathname;
    if (pathname === '/') {
        if (!queryData.searchParams.get('id')) {
        // 디렉토리(폴더) 읽기
            fs.readdir('./data', (err, filelist) => {
                var title = 'Welcome';
                var description = 'Hello, Node.js';
                var list = '<ul>';
                var i = 0;
                // 디렉토리 파일들 갯수에 따라 반복문 실행
                while (i < filelist.length) {
                    list = list + `<li><a href="/?id=${filelist[i]}">${filelist[i]}</a></li>`;
                    i += 1;
                }
                list = list + '</ul>';
                var template = `
                <!doctype html>
                <html>
                <head>
                    <title>WEB1 - ${title}</title>
                    <meta charset="utf-8">
                </head>
                <body>
                    <h1><a href="/">WEB</a></h1>
                    ${list}
                    <h2>${title}</h2>
                    <p>${description}</p>
                </body>
                </html>
                `;
                response.writeHead(200);
                response.end(template);
            });
        } else {
            fs.readdir('./data', (err, filelist) => {
                var list = '<ul>';
                var i = 0;
                while (i < filelist.length) {
                    list = list + `<li><a href="/?id=${filelist[i]}">${filelist[i]}</a></li>`;
                    i += 1;
                }
                list = list + '</ul>';
                // 디렉토리 내부 파일 읽기
                fs.readFile(`data/${queryData.searchParams.get('id')}`, 'utf8', (err, description) => {
                    var title = queryData.searchParams.get('id');
                    var template = `
                    <!doctype html>
                    <html>
                    <head>
                    <title>WEB1 - ${title}</title>
                    <meta charset="utf-8">
                    </head>
                    <body>
                    <h1><a href="/">WEB</a></h1>
                    ${list}
                    <h2>${title}</h2>
                    <p>${description}</p>
                    </body>
                    </html>
                    `;
                    response.writeHead(200);
                    response.end(template);
                });
            });
        }
    } else {
        response.writeHead(404);
        response.end('Not Found');
    }
});

app.listen(3000);
참조
https://www.geeksforgeeks.org/node-js-fs-readdir-method/
728x90
반응형