node inspect

1
2
3
4
5
node --inspect      app.js
node --inspect-brk app.js

nodemon --inspect app.js
nodemon --inspect-brk app.js
  • node app을 크롬 개발자 도구로 디버깅 할 수 있다
  • chrome://inspect/#devices
  • --inspect-brk 옵션은 코드 시작전 멈추는 옵션이다

참고

npm 패키지 unpublish

1
npm unpublish {패키지명} -f
  • 내 패지키 디렉터리로 가서 위 명령을 실행
  • 처음에 브라우저로 npm에 접속한다음에 패키지 > 세팅 에 딜리트가 있는줄 알았는데,
  • cli로 지워야 했다

주의사항

  • unpublish하면 24시간 동안 동일한 이름의 패키지를 publish 할 수 없다

삭제 조건

  • 72 시간 이내에 게시된 패키지
  • 새로 생성 된 패키지의 경우 npm Public Registry의 다른 패키지가 패키지에 종속되지 않는 한 게시 후 처음 72 시간 이내에 언제든지 게시를 취소할 수 있습니다
  • 72 시간 이상 전에 게시된 패키지
    • 다른 패키지의 종속성이 아니어야 한다
    • 지난주에 다운로드 횟수가 300 회 미만
    • 단일 소유자

참고

otp 구현하기

  • 갑자기 otp를 구현하고 싶어졌다

Unix Epoch Time (Unix Time) 구하기

js
1
new Date().getTime(); // unix time

N 구하기

js
1
2
const ts = 30; // 30초 간격으로 토큰을 생성할 것
let N = Math.floor(new Date().getTime() / (ts * 1000));
  • unix time에서 토큰 생성간격 ts 만큼을 나누고 소수점은 버려서 N을 구한다

N 16진수 변환

js
1
let N_hex = ('000000000000000' + N.toString(16)).substr(-16); // 16자리가 되도록 앞에 0 패딩추가
  • N을 16진수로 변환하는데 16자리가 되도록 처리

m 구하기 (시간 베이스 메세지 값)

js
1
let m = Buffer.from(N_hex);
  • N_hex를 byte array로 변환

K 생성하기 (K : 공유키)

js
1
2
3
4
5
const base32 = require('base32'); // base32 모듈 임포트

const random12 = `${Math.random() * Math.pow(10, 20)}`.substring(0, 12); // 12자리 랜덤숫자 생성

const K = base32.encode(random12);
  • 랜덤값으로부터 20자리의 공유키 K 구하기
  • base32 모듈 설치
  • Math.random()으로 생성한 랜덤값을 12자리 문자열로 변환하고 base32인코딩하면 20자리의 문자열을 얻을 수 있음

HMAC hash 얻기

js
1
2
3
const crypto = require('crypto');

let hmac_hash = crypto.createHmac('sha1', K).update(m).digest('hex');
  • 내장 모듈 crypto 에서 hmac hash를 얻을 수 있다

OTP 생성

js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const offset = parseInt(Number(`0x${hmac_hash[hmac_hash.length - 1]}`), 10);

// offset으로부터 4개 바이트 변환
const token_hex_4bytes = hmac_hash.substring(offset * 2, offset * 2 + 4 * 2);
let toekn_hex = '';

toekn_hex += (
'00' + (Number(`0x${token_hex_4bytes.substring(0, 2)}`) & 0x7f).toString(16)
).substr(-2);

for (let index = 2; index < token_hex_4bytes.length; index += 2) {
const element = token_hex_4bytes.substring(index, index + 2);
toekn_hex += ('00' + (Number(`0x${element}`) & 0xff).toString(16)).substr(-2);
}

const token = Number(`0x${toekn_hex}`).toString().substr(-6);
console.log(`token : ${token}`);
  • hmac_hash의 맨 마지막값을 offset으로 한다
  • hmac_hash offset부터 4바이트를 추출한고
  • offset 바이트에 & 0x7f 이진 연산 수행
  • 나머지 3개 바이트에 대해 & 0xFF 연산 수행
  • 6자리 토큰을 만든다고하면 그 결과의 뒤에서 6자리를 토큰으로 한다

개선사항

  • 생성된 토큰 값이 일부분 동일하게 유지된다

참고

nodejs + socketio 로 만드는 채팅 앱, 카카오톡 클론코딩?

  • Web Dev Simplified의 Build a Real Time Chat App With Node.js And Socket.io을 보고 따라만들기
  • nodejs에서 html과 socket.io로 간단하게 챗앱을 만드는 것을 따라해보았다
  • Web Dev Simplified 정말 심플하게 잘알려준다.. ㄷㄷ 따라 만들면서 행복했다
  • 따라만들고 카카오톡같은 css를 입히고,
  • 디테일한 기능을 추가 해줬다

추가한 기능

  • 고유한 프로필 사진 생성(랜덤색 + 이니셜)
  • 현재 채팅에 참가한 유저 목록 위젯
  • width값이 작아지면 유저 목록 위젯 숨김
  • width값이 작아지면 프로필 사진 영역 숨김
  • 같은 사람이 연달아 올릴 때 프로필 사진 생략
  • 같은 사람이 같은 시간에 연달아 올릴 때 가장 최근 메시지에만 시간표시
  • 메시지는 plain text로 표시

소스코드

포트 포워딩 체크 웹 클론코딩, Open Port Check WEB (NodeJs)

  • 서버를 열어놨는데, 외부에서 접근이 가능한지 불가능한지,
  • 포트포워딩을 확인하고 싶으면
  • 핸드폰을 열고 데이터를 켜서 내 서버로 접속해서 확인하는 등 번거롭게 확인했다
  • https://www.yougetsignal.com/tools/open-ports/ 라는 포트포워딩 체크 웹이 있는데
  • 이거를 한번 클론 코딩해보았다

영상설명

  • 나는 ec2에 올려서 테스트해봤다

  • 주소창에 보면 15.165.000.000:4000 으로 나오는데 내 ec2 ip인데 일부러 뒷부분을 000.000으로 바꿔놨다

  • 이 앱은 ec2의 4000포트에서 동작중이다

  • 도메인명이나 ip를 입력하고 포트입력란에 원하는 포트를 입력한다

  • 그리고 check 버튼을 누르면 해당 포트가 열려있는지 확인한다

  • 당연히 해당 포트를 리슨하는 서버가 동작하고 있어야한다

  • 우측 common ports 에서 원하는 포트를 클릭하면 해당 포트로 요청을 보낸다

  • Scan All Common Ports 버튼을 눌러 모든 common port를 스캔한다

  • 0:18 중간에는 마인크래프트 서버를 체크해본다
  • 0:35 localhost로 적으면 내 ec2의 포트를 스캔하게된다
  • localhost를 common port를 모두 스캔해보니 3000번이 열려있다는 것을 알 수 있다
  • 0:48 이 앱이 실행되고 있는 4000번 포트를 스캔해보니
  • 당연하게 열려있는 모습을 확인할 수 있다

소스코드

nodemon 변화감지 디렉터리 지정

cmd
1
nodemon --watch app app/server.js
  • nodemon을 사용해서 코드수정마다 서버를 자동으로 재시작하는데,
  • view와 관련한 코드를 수정할 때 서버가 재시작되는 것은 불필요하고, 세션이 날라가는 등 오히려 불편할 수 있다
  • nodemon이 모든 프로젝트 디렉터리가 아닌 특정 디렉터리의 변화를 감시하고 재시작되는 것을 알아보자

명령어

terminal
1
nodemon ./bin/www
  • 보통 이렇게 아무것도 없이 사용하면, 거의 모든 변화마다 서버가 재시작된다
terminal
1
nodemon --watch routes ./bin/www
  • --watch routes watch옵션을 넣어줌으로써 해당 디렉터리에서 변화가 있으면 재시작하도록 할 수 있다
terminal
1
nodemon --watch routes --watch libs ./bin/www
  • 이런식으로 나열할 수 있다
  • 기본적으로 디렉터리명을 적어야하며, 하위디렉터리는 자동으로 포함된다
  • 그런데 여러개의 디렉터리를 나열을 해야하면은
  • 반대로 무시할 디렉터리를 설정하는게 빠를 수 있다

config file로 설정

nodemon.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"restartable": "rs",
"ignore": [".git", "node_modules/**/node_modules"],
"verbose": true,
"execMap": {
"js": "node --harmony"
},
"events": {
"restart": "osascript -e 'display notification \"App restarted due to:\n'$FILENAME'\" with title \"nodemon\"'"
},
"watch": ["test/fixtures/", "test/samples/"],
"env": {
"NODE_ENV": "development"
},
"ext": "js,json"
}
  • nodemon.json이름으로 파일을 하나 만들고 커스텀할 수 있다
  • 무시할 디렉터리를 ignore 배열에 나열하면 된다

참고

nodejs 파일 목록 출력하기

printFileList.js
1
2
3
4
5
6
const fs = require('fs');
const dirPath = '.';

fs.readdir(dirPath, (error, filelist) => {
console.log(filelist);
});
  • 은근히 자주 쓴다
  • dirPath 변수에 원하는 디렉터리의 경로를 적어주어 확인할 수 있다

내가 활용한 곳

    1. .dockerignore 파일을 추가했는데 동작할까? 궁금해서
    1. 람다 실행환경 디렉터리 구조 파악

npm 명령어

내가 쓰는 명령어

1
2
3
4
5
6
7
8
9
10
npm i
npm i [패키지명]
npm i [패키지명] -D
npm i [패키지명] -g

npm start
npm run [script]

npm repo ; package.json에 있는 레포주소를 브라우저로 연다
npm version ; 버전업 명령어
  • 이렇게를 주로 쓴다
  • npm install aliases: npm i, npm add

짧게 쓰는 npm 명령어

  • npm i == npm install
  • npm i -D == npm i --save-dev
  • npm i -g == npm i --global

npm install option

  • -D ; 개발할때만 쓰이는 패키지를 설치할때 사용한다. 배포할때 포함되지 않는다
  • -g ; 패키지 전역 설치. hexo같은 cli에 바로 명령어를 치는 놈들을 보통 이렇게 설치한다

참고

  • npm i [패키지명] -S 이렇게 --save옵션을 줘야만 package.json에 들어갔는데, npm5부터 기본값이라 안적어도 된다

npm scripts

package.json
1
2
3
4
5
6
7
8
9
10
11
{
// ...
"scripts": {
"build": "hexo generate",
"clean": "hexo clean",
"deploy": "hexo deploy",
"test": "hexo server",
"start": "hexo generate & hexo deploy & git add . & git commit -m "
}
// ...
}
  • 여기에 명령을 등록시켜놓고 npm run build 이런식으로 사용한다
  • 여기서 test, start 스크립트는 run을 생략하여 npm start, npm test 이런식으로 사용할 수 있다
  • 그 외에 stop, restart 를 run 없이 바로 사용할 수 있다

참고