Javascript/Node.js

콘솔에서의 입력값, Not found 구현, 홈페이지 구현, 파일목록 알아내기, 글목록 출력하기

leeeee.yeon 2021. 5. 5. 16:42
콘솔에서의 입력값

syntax 디렉토리에 conditional.js를 만들고 아래와 같이 코드를 작성한다.

var args = process.argv;
console.log(args);

첫번째 자리 - node.js 런타임이 어디에 위치했는지

두번째 자리 - 실행한 파일의 경로

세번째 자리 - 입력값

 

var args = process.argv;
console.log(args[2]);
if(args[2] ==='1'){
    console.log('yes');
} else{
    console.log('no');
}

 

Not found 구현

main.js를 아래와 같이 수정한다.

var http = require('http');
var fs = require('fs');
var url = require('url'); // url이라는 노드는 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;

    if(pathname === '/'){
      fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description){
        var template=`
      <!doctype html>
      <html>
      <head>
        <title>WEB1 - ${title}</title>
        <meta charset="utf-8">
      </head>
      <body>
        <h1><a href="/">WEB</a></h1>
        <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>
        <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);
  • fs.readFile() 함수를 if문 안으로 옮김
  • 만약 / 뒤에 지정되지 않은 문자가 오면 404를 띄우고, 'Not found'를 띄운다.

 

홈페이지 구현

아직 홈이 구현되지 않았다.

홈에서도, 페이지에서도, pathname은 '/'이다.

 

main.js를 아래와 같이 바꾸자.

var http = require('http');
var fs = require('fs');
var url = require('url'); // url이라는 노드는 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;

    if(pathname === '/'){
      if(queryData.id === undefined){
        fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description){
          var title = 'Welcome';
          var description = 'Hello, Node.js';
          var template=`
        <!doctype html>
        <html>
        <head>
          <title>WEB1 - ${title}</title>
          <meta charset="utf-8">
        </head>
        <body>
          <h1><a href="/">WEB</a></h1>
          <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>
          <h2>${title}</h2>
          <p>${description}</p>
        </body>
        </html>
        `
        response.writeHead(200); // 성공적으로 접속했다
        response.end(template);
        }) 
      } else{
        fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description){
          var title=queryData.id;
          var template=`
        <!doctype html>
        <html>
        <head>
          <title>WEB1 - ${title}</title>
          <meta charset="utf-8">
        </head>
        <body>
          <h1><a href="/">WEB</a></h1>
          <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>
          <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);
  • if(queryData.id === undefined ) : if문 추가
파일목록 알아내기

리스트의 추가, 수정, 삭제가 불편함

 

nodejs 디렉토리에 readdir.js를 만들고 아래와 같이 코드를 작성한다.

var testFolder = './data'; // 현재 디렉토리의 data
var fs = require('fs');

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

 

결과:

  • 파일의 목록을 배열 형태로 전달함

 

글목록 출력하기
// main.js
var http = require('http');
var fs = require('fs');
var url = require('url'); // url이라는 노드는 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;

    if(pathname === '/'){
      if(queryData.id === undefined){
        fs.readdir('./data',function(error, 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 = 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',function(error, fileList){
          var list = '<ul>';
          var i = 0;
          while(i < fileList.length){
            list = list + `<li><a href="/?id=${fileList[i]}">${fileList[i]}</a></li>`;
            i = i + 1;
          }
          list = list+'</ul>';
          fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description){
            var title=queryData.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);
  • fs.readdir() 함수 추가 - data 디렉토리에 있는 파일들을 읽어와 ul을 그에 맞게 수정
  • 만약 data 디렉토리에 파일이 추가/삭제되면 그것이 자동적으로 페이지에 반영됨
  • 괄호에 주의하자!

처음에 본문에도 Nodejs로 향하는 하이퍼링크가 걸리는 문제가 발생하였다.

코드를 열심히 비교해본 결과 <a> 태그를 닫아주지 않은 것을 발견할 수 있었다 !!

<a> 태그도 닫는 태그가 필요하다는 것을 다시 한번 되짚고, 배열 사용할 때 [i] 붙여주는 것두 잊지 말자.

해결