본문 바로가기
JavaScript/Node.js

생활코딩 Node.js 파일목록 알아내기 등등

by mingutistory 2020. 4. 13.
728x90

파일목록 알아내기

var testFolder = './data';
var fs = require('fs'); 

fs.readdir(testFolder, function(error, filelist) {
 console.log(filelist); 
}); 

파일 리스트 결과는 [ 'CSS', 'HTML', 'JavaScript'] : 배열 형식으로 파일 리스트를 반환함. 배열을 반복문으로 처리 가능

 

App 제작 - 글목록 출력하기

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 = url.parse(_url, true).query;
    var pathName = url.parse(_url, true).pathname;
    var title = queryData.id;
    var template; 

    if(pathName === '/') {
      if(title === undefined) {

        fs.readdir('./data', function(error, filelist){
          title = 'Welcome'; 
          var description = 'hello node.js'; 
        //   var list = `<ol>
        //   <li><a href="/?id=HTML">HTML</a></li>
        //   <li><a href="/?id=CSS">CSS</a></li>
        //   <li><a href="/?id=JavaScript">JavaScript</a></li>
        // </ol>`;

        var list = '<ol>';
        var i = 0; 
        while(i < filelist.length) {
          list += `<li><a href = "/?id=${filelist[i]}">${filelist[i]}</a></li>`
          i += 1;
        }
        list += '</ol>';
          template = `
          <!doctype html>
          <html>
          <head>
            <title>WELCOME</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', function(error, filelist){

        var list = '<ol>';
        var i = 0; 
        while(i < filelist.length) {
          list += `<li><a href = "/?id=${filelist[i]}">${filelist[i]}</a></li>`
          i += 1;
        }

        fs.readFile(`data/${title}`, 'utf8', function(err, description) {
        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);

jsp에서 include를 사용하는 것처럼 이렇게 사용할 수 있는 듯 한데 내가 그런 부분을 프로젝트 할 때 잘 사용하지 않아서 인지 왜 이걸 배우는데 이렇게 혁명적으로 느껴지는 걸가. 흠. 재미있다. 

 

함수를 이용해서 정리

코드가 길어지면 사람이 관리하기에는 너무 복잡. 함수로 정리 정돈 필요. 

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

function templateHTML(title, list, body) {
  return `
  <!doctype html>
  <html>
  <head>
    <title>${title}</title>
    <meta charset="utf-8">
  </head>
  <body>
    <h1><a href="/">WEB</a></h1>
    ${list}
    ${body}
  </body>
  </html>        
  `;
}

function templateList(filelist) {
  var list = '<ol>';
  var i = 0; 
  
  while(i < filelist.length) {
    list += `<li><a href = "/?id=${filelist[i]}">${filelist[i]}</a></li>`
    i += 1;
  }
  
  list += '</ol>';

  return list; 
}

var app = http.createServer(function(request,response){
    var _url = request.url;
    var queryData = url.parse(_url, true).query;
    var pathName = url.parse(_url, true).pathname;
    var title = queryData.id;
    var template; 

    if(pathName === '/') {
      if(title === undefined) {

        fs.readdir('./data', function(error, filelist){
          title = 'Welcome'; 
          var description = 'hello node.js'; 
          var list = templateList(filelist);
          template = templateHTML(title, list, `<h2>${title}</h2><p>${description}</p>`);
          response.writeHead(200); 
          response.end(template);
        });
        
      }else {
        fs.readdir('./data', function(error, filelist){
          var list = templateList(filelist);
          fs.readFile(`data/${title}`, 'utf8', function(err, description) {
          template = templateHTML(title, list, `<h2>${title}</h2><p>${description}</p>`);
            response.writeHead(200); 
            response.end(template);
          });     
      })
    }
    }else {
      response.writeHead(404); 
      response.end("Not Found");
    }

}); 
app.listen(3000);

 

 

프로젝트 하면서 정말 아쉬웠던 부분이 코드 중복이었다. 함수를 만들어서 사용 한 부분도 분명히 있지만 그러지 못한 부분들도 많았기 때문기 때문에 이런 부분들이 소중함. 

 

수업의 정상

javascript > Node.js > Web Application 

진도 나아가기 선택 (당당)

 

Node.js에서 동기와 비동기 

synchronous & asynchronous

비동기적인 것은 효율적이지만 복잡함. 

 

File System > fs.link / linkSync / lstat / lstatSync .. 

fs.readFile(path[, options], callback) 

fs.readFileSync(path[, options]) 

 

동기적 방식

var fs = require('fs'); // fs 모듈을 불러와서 사용

// readFileSync
console.log('A');
var result = fs.readFileSync('./sample.txt', 'utf8');
console.log(result);
console.log('C'); 

 

console : A B C

Node.js는 동기적 방식 선호

readFile 메소드 3번째 자리에는 콜백 함수가 온다. 

fs.readFile('', 'utf8', function(err, reuslt) {

}); 

readFileSync는 리턴값이 존재하지만 readFile은 리턴값이 존재하지 않음. 대신 콜백 함수를 세번째 인자로 주고, node.js가 파일 읽는 작업이 끝나면 콜백 함수를 실행시키면서 에러가 있다면 err(첫번째 인자)를 제공하고, 두번째 파라미터는 파일의 내용을 인자로서 제공함. 

// readFile
console.log('A');
fs.readFile('./sample.txt', 'utf8', function(err, result) {
    console.log(result);
});
console.log('C'); 

console : A C B

 

Node.js의 성능을 높이기 위해서는 비동기적 방식 사용 필요. 

 

콜백

저번에 한번 정리했지만 한 번 더 정리해야지

fs.readFile('./sample.txt', 'utf8', function(err, result) {

    console.log(result);

});

파일을 읽은 뒤 함수를 호출하는 것을 통해서 사용하는 것. 

항상 이고잉님이 말씀해주시는 이걸 이해 못한다고 해서 좌절하지 말고 이해하기 전에 익숙해 질 수 있다고 한번 더 말해주시니까 안심. 항상 느끼지만 좋은 길잡이가 있는 것은 감사한 일이다. 나도 그런 사람이 되고 싶다. (뜬금)

 

// function a() {
//     console.log('A'); 
// }

// 이름이 없는 함수. 익명함수.
var a = function() {
    console.log('A'); 
} // 함수가 값이다. 변수에 함수를 저장하는 것. 

a();  

 

기능 실행 한 뒤 함수가 끝났다는 것을 알리고 싶다면 그 함수는 인자로 callback을 받으면 됨.

 

var a = function() {
    console.log('A'); 
} 

function slowfunc(callback) {
    callback(); 
}

showfunc(a); 

 

300x250

댓글