사용자가 서버 쪽으로 data를 전송하기 위한 방식으로 HTML의 form 태그 사용

 

<form> 태그

웹 페이지에서의 입력 양식으로, 화면에 보이지 않는 추상적인 태그

(ex. 로그인 창, 회원가입, 등)

속성 action 은 사용자가 입력한 정보를 어디로 보낼 것인지 링크를 설정해준다. 

 

<input> 태그

사용자가 양식을 입력하기 위한 태그 

속성  type(종류), name(데이터 이름), value(기본 값)

type를 text로 설정하면 문자를 입력할 수 있는 폼이 생성됨

type를 password로 설정하면 사용자가 입력하는 문자가 별표 처리 된다. 

type를 submit으로 설정하면 제출하는 버튼이 생성된다. 

 

<form action="http://localhost:3000/process_create" method="post">  
    <p><input type="text" name="title"></p>
    <p>
      <textarea name="description"></textarea>
    </p>
    <p>
      <input type="submit">
    </p>
  </form>

'Web > HTML\CSS\JavaScript' 카테고리의 다른 글

[HTML5] 히든 필드(Hidden field) 사용하는 이유  (0) 2022.03.09
[JavaScript] Object  (0) 2020.07.31
[JavaScript] Function  (0) 2020.07.25
[JavaScript] Array data type  (0) 2020.07.25
JavaScript 기본 문법과 제어문  (0) 2020.07.21

Package Manger : 소프트웨어들을 생성, 설치, 업데이트, 삭제, 등을 관리해 주는 프로그램 

 

NPM : Node.js 에서 가장 광범위하게 사용, 기본적으로 node.js를 설치할 때 함께 설치되는 package manger

 

https://pm2.keymetrics.io/

 

PM2 - Home

Advanced process manager for production Node.js applications. Load balancer, logs facility, startup script, micro service management, at a glance.

pm2.keymetrics.io

pm2 : node.js를 하나하나 껐다 켰다를 반복할 필요 없이 변화가 생기면 자동으로 껐다 켜주는 역할

 

npm install pm2 -g

-g의 의미 : 내가 깔고 있는 소프트웨어가 독립된 존재로 컴퓨터 내에서 쓰일 수 있도록 한다. 

 

pm2 start 실행시키고자하는파일이름.js

파일 실행 

 

pm2 start 실행시키고자하는파일이름.js --watch

이전의 경우 코드를 수정하면, 실행한 파일을 종료(ctrl+c) 후 다시 실행시켜야 하는데, 이제는 reload만 하면 바로 실행됨

 

pm2 log

pm2 start main.js --watch 를 사용하면 실행이 됐는데 백그라운드로 몰래 실행되고 있기 때문에 어떤 상태인지 알 수 없음 그래서 pm2 log를 사용함

pm2 log는 어떠한 문제점이 있을 때 그 문제점을 바로 보여줌

 

pm2 list

실행되는 프로세스의 리스트

 

pm2 start 실행시키고자하는파일이름.js --watch --no-daemon

daemon : 백그라운드로 실행되는 프로그램

no-daemon : daemon이 아닌상태로 실행 

pm2를 실행하는 것과 동시에 log까지 볼 수 있음 

[ctrl+c] 입력시 종료 (안되는 때도 있음)

 

pm2 monit

pm2에 의해 현재 실행되고 있는 프로그램들이 보임

 

pm2 stop 실행종료하고자하는프로세스의이름

실행종료

 

pm2 kill

pm2로 켜진 프로세스들을 전부 종료

synchronous (동기적)

우리가 일을 할 때를 생각해보자

일 10분 -> 일 2시간 -> 일 1시간 -> 일 40분

일이 다 끝날때까지 기다리다가 다 끝나면 다른 일 시작

(일이 오랫동안 처리되어야 하는 경우에도 기다렸다가 다음 일 처리)

 

asynchronous (비동기적) - 효율적 but 복잡

일 10분 -> 일 2시간

               -> 일 1시간 

일이 끝날때까지 기다리지 않고 다음 일 진행

(병렬적으로 동시에 여러가지 일 처리)

 

동기 & 비동기 가 코드 level 에서 어떤 차이를 갖는지 ?

https://nodejs.org/dist/latest-v12.x/docs/api/https://nodejs.org/dist/latest-v12.x/docs/api/fs.html

 

Index | Node.js v12.18.3 Documentation

 

nodejs.org

위의 링크에 들어가서 확인해 보면 

이름 뒤에 sync가 붙는 경우가 있고 아닌 경우가 있다. 

 

readFileSync (동기적)

fs.readFileSync(path[, options]);

// syntax directory 안에 sample.txt가 저장되어있음
// sample.txt 내용은 'B'
console.log('A');
var result = fs.readFileSync('syntax/sample.txt','utf8');
console.log(result);
console.log('C');

A B C 순서로 출력됨

 

readFile (비동기적)

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

readFileSync는 return 값을 반환하는데,

반면에 readFile은 return값을 주지 않기 때문에 함수를 세번째 인자로 주어야 

함수의 첫번째 parameter : error가 있다면 'err' 인자로 제공

두번째 parameter : 파일의 내용을 인자로서 구분해주도록 약속되어있음

// syntax directory 안에 sample.txt가 저장되어있음
// sample.txt 내용은 'B'
console.log('A');
fs.readFile('syntax/sample.txt','utf8',function(err,result){
    console.log(result);
});
console.log('C');

A C B 순서로 출력됨

readFile이 동작이 완료되기 전에 'C 출력'이 실행됨

 

callback

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

위 코드를 보면 "a라는 변수에 값으로써 함수를 정의  : javascript에서는 함수 = 값" 이라는 점을 알 수 있다. 

 

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

function showfunc(callback){
    callback();
}

showfunc(a);

-위 코드 해설-

showfunc라는 오랜시간이 걸려 동작하는 함수가 실행되고

callback 이라는 parameter는 a가 가리키는 함수를 가리키게 된다

callback()이라는 함수를 호출하면 a가 가리키는 함수가 실행된다

 

완전히 똑같은 코드는 개선의 여지가 있음 - " 중복 제거"

 

<기존 코드>

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;
    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 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>';
          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);

 

1. 중복된 부분 (1)

 `
          <!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>
          `;

 

2. 함수화 -> 함수 templateHTML

 

3. 정리

 

해당 부분 안에 

<h2>${title}</h2>
<p>${description}</p>

부분을 ${body}로 바꾼다. ( 페이지 형태에 따라 형식이 다를 수 있는 부분이기 때문에 변경)

 

function templateHTML(title,list,body) 정의

호출부분은 var template = templateHTML(titlelist`<h2>${title}</h2>${description}`); 로 바꾼다. 

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

 

4. 중복된 부분이 또 없는지 check

 

5. 중복된 부분 (2) 

          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>';

 

6. 함수화 -> templateList()

 

7. 정리

list 라고 하는 값 return 

코드를 실행하기 위해서는 filelist라는 값이 필요한데, 함수의 매개변수로 filelist를 입력받아야 함

-> function templateList(filelist){ }

호출 부분 : var list = templateList(filelist); 

function templateList(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>';
  return list;
}

 

<바꾼 전체 코드>

var http = require('http');
var fs = require('fs');
var url = require('url');
 
function templateHTML(title, list, body){
  return `
  <!doctype html>
  <html>
  <head>
    <title>WEB1 - ${title}</title>
    <meta charset="utf-8">
  </head>
  <body>
    <h1><a href="/">WEB</a></h1>
    ${list}
    ${body}
  </body>
  </html>
  `;
}
function templateList(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>';
  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;
    if(pathname === '/'){
      if(queryData.id === undefined){
        fs.readdir('./data', function(error, filelist){
          var title = 'Welcome';
          var description = 'Hello, Node.js';
          var list = templateList(filelist);
          var template = templateHTML(title, list, `<h2>${title}</h2>${description}`);
          response.writeHead(200);
          response.end(template);
        })
      } else {
        fs.readdir('./data', function(error, filelist){
          fs.readFile(`data/${queryData.id}`, 'utf8', function(err, description){
            var title = queryData.id;
            var list = templateList(filelist);
            var template = templateHTML(title, list, `<h2>${title}</h2>${description}`);
            response.writeHead(200);
            response.end(template);
          });
        });
      }
    } else {
      response.writeHead(404);
      response.end('Not found');
    }
 
 
 
});
app.listen(3000);

Function

- 일련의 프로그램에 대해 이름을 붙인  

- 가독성을 높일  있음

- 유지 보수의 편의성이 급격히 높아짐 ex) 함수를 호출하는 곳이 1억개라면, 1억개가 동시에 바뀜

function f123(){
    console.log(1);
    console.log(2);
    console.log(3);
}
f123();
console.log('A');
f123();

 

Input

console.log(Math.round(1.6));    //2
console.log(Math.round(1.4));    //1

Math : javascript가 내장하고 있는 객체 (객체함수들을 관리하는 directory)

round : 반올림을 해주는 함수

round 함수를 살펴보면 입력값이 존재함 (1.6 1.4)

 

function sum(first,second){		// parameter
    console.log(first+second);
}
sum(2,4);	//argument

입력값을 sum이 받기 위해서는 sum이 호출한 부분과 sum을 정의되어있는 부분 사이에 서로 매개되어있는 매개 변수 필요함

함수는 입력값을 받을 수 있고 그에 따라 다르게 동작할 수 있음

각각의 입력값 하나 하나를 argument(인자) 라고 함

argument를 받아서 함수안으로 전달해 주는 매개체를 parameter(매개변수) 라고 함

 

Output

위에서 작성한 sum함수와 JavaScript에 내장되어 있는 함수 Math.round 를 비교해 보면 sum 함수는 호출 할 때마다 해당 값이 출력이 됨

보기에는 sum 함수가 더 편하고 좋아보이지만 융통성이 떨어짐

출력되진 않고 값을 return하는 함수의 경우, console.log를 이용하여 화면에 출력할 수 있고, filewrite를 이용하여 파일에 출력할 수도 있음 또한 이메일로도 출력할 수 있음

return: (1) 어떤 값을 출력 (2) 함수 종료

function sum(first,second){
    return first+second;
}
console.log(sum(2,4));

 

'Web > HTML\CSS\JavaScript' 카테고리의 다른 글

[JavaScript] Object  (0) 2020.07.31
[HTML] form  (0) 2020.07.30
[JavaScript] Array data type  (0) 2020.07.25
JavaScript 기본 문법과 제어문  (0) 2020.07.21
[HTML] 기본문법 태그  (0) 2020.07.13

data directory 에 파일이 추가되거나 수정되고 삭제되는 것을 Node.js를 통해 어떻게 알아낼 수 있는가?

"Node.js file list in directory" 검색 후 결과 중 아래 링크 참고 ( "fs.readdir")

https://stackoverflow.com/questions/2727167/how-do-you-get-a-list-of-the-names-of-all-files-present-in-a-directory-in-node-j

 

How do you get a list of the names of all files present in a directory in Node.js?

I'm trying to get a list of the names of all the files present in a directory using Node.js. I want output that is an array of filenames. How can I do this?

stackoverflow.com

위 링크에 나온 코드 이용하여 공부!

 

// nodejs 폴더에 readdir.js 파일 생성

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

 

./data 

실행하는 위치를 기준으로 'data'라는 directory의 경로를 testFoler에 저장

(./ : 현재 directory)

 

글목록 출력하기 

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;
    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 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>';
          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);

 

소스코드에서는 filelist 배열의 개수(길이)만큼 while 반복문이 실행된다. 

현재 data directory 내에는 CSS,HTML,JavaScript라는 파일이 존재하는데, 만약 내가 directory 안에 file1,file2 라는 파일을 추가로 생성한다면 웹 페이지에는 CSS,HTML,JavaScript,file1,file2 라는 이름을 가진 링크가 출력된다. 

 

Array data type (배열)

배열에서는 자릿수가 0부터 counting 된다. 

배열의 개수를 셀 때는 0부터가 아닌 1 부터 counting한다. (배열이름.length)이용

배열의 끝에 데이터를 추가하고 싶으면  " javascript array add data" 검색 - (배열의이름.push )사용

 

//배열 생성
var arr = ['A','B','C','D'];

//배열 읽기
console.log(arr[1]);    //B
console.log(arr[3]);    //D

//배열요소 바꾸기
arr[2]=3;

//배열의 개수
console.log(arr.length);

//배열의 끝에 데이터 추가
arr.push('E');

 

Array & Loop

var number = [1,400,12,34,5];
var i =0;
while(i<5){
    console.log(number[i]);
    i=i+1;
}

 

배열에 숫자를 추가할 경우반복문에서 추가한 숫자가 출력되지 않음

5라고 지정했기 때문

5대신 number.length를 사용하면 문제 해결

var number = [1,400,12,34,5];
var i =0;
while(i<number.length){
    console.log(number[i]);
    i=i+1;
}

 

배열의 요소들의 값을 더하여 출력하면 ( 배열의 요소의 개수가 변할 경우 대비하여 작성)

var number = [1,400,12,34,5];
var i =0;
var total = 0;
while(i<number.length){
    total=total+number;
    i=i+1;
}
console.long(`total:${total}`);

'Web > HTML\CSS\JavaScript' 카테고리의 다른 글

[HTML] form  (0) 2020.07.30
[JavaScript] Function  (0) 2020.07.25
JavaScript 기본 문법과 제어문  (0) 2020.07.21
[HTML] 기본문법 태그  (0) 2020.07.13
[HTML+CSS3] 링크만들기  (0) 2020.05.25

<기존 코드>

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;
 
    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>
          <ul>
            <li><a href="/?id=HTML">HTML</a></li>
            <li><a href="/?id=CSS">CSS</a></li>
            <li><a href="/?id=JavaScript">JavaScript</a></li>
          </ul>
          <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);

pathname이라는 값을 통해서는 Home 과 각각의 페이지를 구분할 수 없음

반복문을 중첩해서 사용함으로써 구분!

JavaScript 에서는 없는 값을 호출 할 때, "undefined "라 부름

if(queryData.id === undefined){	//HOME

}else{	//각 페이지

}

 

<전체 코드>

 

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;
    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>
            <ul>
              <li><a href="/?id=HTML">HTML</a></li>
              <li><a href="/?id=CSS">CSS</a></li>
              <li><a href="/?id=JavaScript">JavaScript</a></li>
            </ul>
            <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>
            <ul>
              <li><a href="/?id=HTML">HTML</a></li>
              <li><a href="/?id=CSS">CSS</a></li>
              <li><a href="/?id=JavaScript">JavaScript</a></li>
            </ul>
            <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);

+ Recent posts