Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

9시 24분

callback, 패키지 매니저와 PM2, 글 생성, POST 방식으로 전송된 데이터 받기, 파일 생성과 리다이렉션 본문

Javascript/Node.js

callback, 패키지 매니저와 PM2, 글 생성, POST 방식으로 전송된 데이터 받기, 파일 생성과 리다이렉션

leeeee.yeon 2021. 5. 12. 21:35
callback
fs.readFile('syntax/sample.txt', 'utf8', function(err,result){
    console.log(result);
});

파일을 읽고 그 작업이 끝난 후 저 함수를 호출함 > 작업이 끝나고 처리할 일을 function 안에 쓴다. 

 

// callback.js

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


var a = function(){
    console.log('A');    
} // 함수가 값이다.

a();

function slowfunc(callback){
    callback();
}

slowfunc(a);

Javascript에서는 함수를 값으로 저장할 수 있다.

slowfunc 함수에서 인자를 callback으로 받고 위와 같이 코드를 작성하면 callback 함수가 호출될 때 함수 a가 실행된다.

 

패키지 매니저와 PM2

패키지 매니저: 패키지를 생성, 수정, 삭제하는 프로그램

패키지 매니저 중 NPM에 대해 알아볼 것이다. ( node.js 설치할 때 같이 설치됨 )

PM2: 프로세스 관리 도구, 프로그램을 감시, 파일 수정되면 프로그램 다시 껐다 켜주는 등 프로세스 관리를 쉽게 해준다.

 

pm2 설치
pm2 실행
실행중인 프로세스 리스트 확인
실행중인 프로세스 중단 (main.js 멈춰~)
-- watch를 붙여서 main.js 모니터링

원래는 코드를 수정하고 확인하고 싶을 때, main.js를 끄고 다시 켜야 하는데, 이제는 새로고침만 해도 수정된 내용 확인 가능

변화 내용 로그 보여줌

 

HTML form

form : 사용자가 서버 쪽으로 데이터를 전송하기 위한 방식

 

form.html을 만들어 실습해보자.

<body>
    <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>
</body>

form 태그를 통해 글을 작성하고 제출 버튼을 누르면 아래와 같이 action의 URL로 이동

URL 뒤에 작성한 데이터가 뜬다.

그러나 주소에 데이터가 포함되어 있다면, 서버의 정보가 생성/수정/삭제될 수 있으므로 URL로 데이터를 보내는건 위험하다.

 

그래서 method에서 POST 방식을 이용하여 데이터를 안 보이는 방법으로 전송한다. ( URL에 표시하는 건 get method 또는 method 생략 )

 

글 생성

templateHTML() 함수를 다음과 같이 수정해주고,

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

  • ${list} 아래 글 생성 페이지로 가는 하이퍼링크 추가

 

if(pathname === '/') 뒤의 else if 문을 다음과 같이 추가해준다.

 else if(pathname === '/create'){
      fs.readdir('./data',function(error, fileList){
        var title = 'WEB - Create';
        var list = templateList(fileList);
        var template = templateHTML(title, list,`
        <form action="http://localhost:3000/process_create" method="POST">
            <p><input type="text" name="title" placeholder="title"></p>

            <p>
                <textarea name="description" placeholder="description"></textarea>
            </p>

            <p>
                <input type="submit">
            </p>
        </form>
        `);
      response.writeHead(200); // 성공적으로 접속했다
      response.end(template);
      });
    }

(결과는 위 사진 참고)

 

다중 if문이기 때문에 어떤 if문 뒤에 else if를 써야하는지 주의하자!

 

submit 버튼을 누르면 앞에서 했던거처럼 process_create 페이지로 가고 개발자 도구의 Network를 확인해보면,

데이터가 잘 전송된 것을 확인할 수 있다.

 

POST 방식으로 전송된 데이터 받기

querystring 모듈을 받아오자

var qs = require('querystring');

 

else if문을 하나 더 추가하자

else if(pathname === '/create_process'){
      var body = '';
      request.on('data', function(data){
        // 데이터가 많을 경우 조각조각의 데이터를 인자로 콜백 함수를 호출 > 수신한 정보를 줌
          body += data;
      });
      request.on('end', function(){ // 더 이상 들어올 정보가 없으면 콜백 함수를 호출
        var post = qs.parse(body); // post 안에 POST 데이터가 들어있을 것
        console.log(post);
      });
      response.writeHead(200);
      response.end('sucess');
    }

 

글을 작성하면 post의 정보가 이렇게 콘솔 창에 출력된다

( BUT, pm2로 main.js를 실행하면 콘솔 창에 출력이 안되고, node 명령어로 main.js를 실행해주어야 작동한다. 왜일까 ...?! )

 

파일생성과 리다이렉션

POST 방식으로 전송된 데이터를 data 디렉토리 안에 파일로 저장하는 방법을 알아보자. > file write에 대해 알아야해

 

else if(pathname === '/create_process') 안에 있는 request.on 함수를 아래와 같이 추가해주자.

request.on('end', function(){ // 더 이상 들어올 정보가 없으면 콜백 함수를 호출
	var post = qs.parse(body); // post 안에 POST 데이터가 들어있을 것
	var title = post.title;
    var description = post.description;
    fs.writeFile(`data/${title}`, description, 'utf8', function(err){ // 에러가 있을 때 에러를 처리하는 방법
		response.writeHead(200);
        response.end('sucess'); 
    });
    console.log(post);
});
  • fs.writeFile() 함수 추가

이제 create에서 글을 생성해주면, 아래처럼 data 디렉토리에 생성해준 글이 파일로 저장된 것을 볼 수 있다.

 

이제 success 화면이 아닌, http://localhost:3000/?id=nodejs로 페이지를 이동시킬 수 있도록 하고 싶다. 이런 작업을 리다이렉션이라고 한다.

 

 

글을 적어주었다! 두근두근

 

리다이렉션 성공 ~

 

이번 글은 여기까지 하고 자르고, 다음 글에서 수정 및 삭제부터 이어서 하자 ~