본문 바로가기
JavaScript/Node.js

생활코딩 Node.js 패키지 매니저와 PM2 등등

by mingutistory 2020. 4. 14.
728x90

Node.js의 패키지 매니저와 PM2

Package : 독립적으로 실행되는 프로그램 

패키미 매니저 : 생성, 설치, 업데이트, 삭제 등의 역할을 해주는 것. 

NPM : Node.js를 사용 할 때 설치한 패키지 매니저.

PM2 : process manager for Node.js > 실행 중인 프로그램 (Node.js를 통해 만든 프로그램) , 우리가 만든 프로세스들을 감시하고 있다가 꺼지고 하면 다시 실행시켜주는 역할. 파일의 수정을 관찰하다가 프로그램을 껐다가 켜주는 그런 .. 

 

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

npm install pm2 -g

> 설치가 실행 됨. 신기하구먼.

 

pm2 start first/main.js 해주니까 실행되면서

이런 화면이 떴다.

status : online이라고 되어있으면 실행 중인 상태를 의미. 

 

pm2 monit 

pm2 list

pm2 stop

pm2 log

 

혼란하다 혼란해.

node.js로 실행하면 오류 안나는데 pm2로 start main.js하고 실행시키니까 상태가 online은 됬는데 localhost:3000/ 으로 들어갔을 때 사이트를 연결 할 수 없다고 오류가 나면서 저런 식으로 로그가 찍혔다.

제대로 아는 상태가 아니다 보니까 황당하기만 하군. 

 

별별 오류를 다 보고 있다. 제대로 종료가 되지 않아 node.js에서 실행시키면 address already in us 오류가 났다.

이런 경우 netstat -ano 명령어를 통해서 포트를 사용 중인 모든 프로세스를 찾고 PID를 확인한다.

 

 오른쪽 화면의 3000번 포트 PID와 node.exe 하나 프로세스의 PID가 같은 것을 확인 할 수 있고 작업 종료를 해주었다. 

아니 근데 작업을 끝내면 다른 것이 실행되는게 아닌가... 그래서 PID가 다른 것을 꺼버렸더니 둘 다 종료 되었고 다시 실행하니 해결이 되었다. 

도대체 왜 저런 오류가 나는 것인가 ?

혼란하다 혼란해. 

 

pm2의 버전 문제라는 글을 보고 버전을 내려줬더니 해결이 되었다.

pm2 -v : 버전을 확인해보니 처음에는 4.2.3 이었는데 3.2.4 버전으로 내려주라고 그래서 npm install pm2@3.2.4 -g 명령을 사용했다. 그러니까 해결.

 

8분짜리 강의를 30분 동안 듣게 되는 마법.

그런데 버전을 내리고도 log를 찍어보면 length 저거는 계속 뜬다. 근데 console로 로그 찍어본것도 뜬다. 아니 무슨 말이야.!

 

HTML - Form

누구나 웹을 통해서 데이터를 전송하고 데이터 디렉토리 안에 생성하고 싶다는 마음.

내용 넘김. 

 

글 생성 UI 만들기

다시 또 혼란한 부분이 생겼다.

pm2의 필요성은 코드의 변화를 인지하고 자동으로 서버를 껐다가 켜준다고 설명해주셨는데 a 태그 수정 한게 반영이 되지 않았다. 혹시나해서 껐다가 키니까 반영됨. 혼란스러운 것은 node.js를 통해서 서버를 켰을 때는 리로드를 통해서 수정 사항이 반영됬었다는 사실.... 뭔데....

 

또 다시 시간이 흐르니 해결 되었다. 

(답답해 죽어버림..)

 

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}
    <a href = "/create">create</a>
    ${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 if(pathName === '/create'){
      fs.readdir('./data', function(error, filelist){
        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" placeholder="title"></p>
            <p>
              <textarea name="description" placeholder="description" placeholder="description"></textarea>
            </p>
            <p>
              <input type="submit">
            </p>
          </form>
        `);
        response.writeHead(200);
        response.end(template);
      });
    }else {
      response.writeHead(404); 
      response.end("Not Found");
    }

}); 
app.listen(3000);

 

재미있다. 아무래도 일정 끝내고 시간 내서 하는 이게 맞는 것 같아. 

300x250

댓글