반응형

◎ PM2 란?

▼ node js를 실행하는 프로세스를 제어할수있다.

다중으로 실행 , 끄기 , 강제로종료해도 프로세스가 다시살아나기 등등을 할수 있는 패키지이다


◎ PM2 패키지 설치법

▼ 내용.

npm install pm2 -g //global 이란 뜻이다. 어디서든 사용할수 있다는 옵션이다

◎ PM2 패키지 사용법

▼ 내용

아래와 같이 실행하면 아래 사진처럼 현재 status를 알려준다

실행되고 다시 콘솔로 오는거 같다

pm2 start app.js pm2 start app.js --watch // 실행할 js파일을 --watch 옵션으로 실행하면 소스 수정후 저장하면 // 자동으로 node를 재시작해줘서 소스적용이 된다. pm2 start app.js --watch --no-daemon //백그라운드로 실행되는 프로그램을 데몬이라고 부릅니다. //nodaemon을 치면 백그라운드 실행이아니라서 실행후 바로 log를 볼수있게됩니다. pm2 start app.js --watch --ignore-watch="(파일경로)" --no-daemon //이렇게 실행할경우 해당 파일경로에 파일들이 수정될때는 서버가 재시작 하지 않는다


◎ PM2 모니터링

▼ 내용

pm2 모니터링 왼쪽 창이 현재 실행중인 프로세스의 목록이다

pm2 monit


◎ pm2 list 확인

▼ 내용

pm2 의 현재 실행중인 프로세스 status 확인

pm2 list



◎ pm2 프로세스 종료

▼ 내용

pm2로 실행한 프로세스를 종료할수 있다.

pm2 stop [App name] // pm2 list 로 확인한 appname 이름을 써주면된다. pm2 kill // pm2 로 시작한 모든 프로세스를 죽인다


◎ pm2 로그확인

▼ 내용

pm2로 실행할경우 console에 아무것도 안찎혀 로그를 안남기는데

실시간으로 log를 보여주는 명령어다

pm2 log




반응형
반응형

◎ XSS 란?

크로스 사이트 스크립팅 (또는 사이트 간 스크립팅) 이라고 불리며 영문명칭은 cross-site scripting 로 영문약어는 xss 이다 웹 애플리케이션에서 많이 나타나는 취약점의 하나로 웹사이트 관리자가 아닌 사용자가 웹페이지에 악성 스크립트를 삽입할수 있는 취약점이다.

그래서 웹개발자들은 주로 xss필터를 고려하여 개발을 한다. sanitize-html 은 이러한 공격 기법을 막기위해 나온 nodejs의 모듈이다.


◎ sanitize-html 란?

▼ 내용

sanitize : 소독하다

html의 input 또는 textarea 또는 기타등등의 사용자 입력정보에 <script>코드기술</script> 이란 정보를 적을시 웹브라우저에서 저게 txt가 아닌 script 기술로 받아들여서 사용자가 이를 악용하여 악성스크립트를 집어넣을 수 있다.

이것을 방어하기 위한 node의 패키지모듈로 <script>,<a> 등등 기타 태그들을

변환시켜주어 악성스크립트로 변질되는 것을 막아주는 보안 라이브러리다.


◎ sanitize-html 설치방법

▼ 내용

-S : 해당프로젝트에서만 적용

-g : 전체 글로벌 적용

npm install -S sanitize-html

◎ sanitize-html 사용법

▼ 공식문서

var sanitizeHtml = require('sanitize-html'); var dirty = 'some really tacky HTML'; var clean = sanitizeHtml(dirty);

▼ 예제

var sanitizeHtml = require('sanitize-html'); var dirty = `스크립트는 과연 <script>some really tacky HTML</script> 무시될까? h1태그는 <h1>링크</h1> 무시가 될까?`; var clean = sanitizeHtml(dirty); console.log(clean); /*스크립트는 과연 무시될까? h1태그는 링크 무시가 될까?*/

▼ 결과


▼ 내용

위 처럼 sanitize 를 사용하면 script 같은 태그는 출력이 안되게하고, h1 태그같은경우도 태그는 없애 버린다. 하지만 웹에서 실행해보면 글씨포인트는 커진상태로 태그만 사라진다. 이처럼 악성스크립트를 사전에 차단시킬수 있다. xss필터 같은경우로 사용할수 있다.


◎ sanitize-html 태그 허용하기

▼ 내용

모든걸 sanitize 로 자동 clean 시키는게아니라. 허용적으로 태그를 허용하게 할수도있다.

▼ 공식문서

// Allow only a super restricted set of tags and attributes clean = sanitizeHtml(dirty, { allowedTags: [ 'b', 'i', 'em', 'strong', 'a' ], allowedAttributes: { 'a': [ 'href' ] }, allowedIframeHostnames: ['www.youtube.com'] });

▼ 예제

var sanitizeHtml = require('sanitize-html'); var dirty = `h1태그는 <h1>링크</h1> 무시가 될까?`; var sanitizedDescription = sanitizeHtml(dirty,{ allowedTags:['h1'] }); console.log(sanitizedDescription); //h1태그는 <h1>링크</h1> 무시가 될까?


반응형
반응형

◎ POST 또는 GET 을 사용하는 이유

▼ 내용

post 는 데이터의 crud 중 cud를 할경우는 무조건 post

select 만 할경운 get 방식으로 해도 상관없다


◎ FORM 데이터 받기 (POST)

var qs = require('querystring'); var app = http.createServer(function(request,response){ var body = ''; request.on('data',function (data){ //request 데이터 body += data; if (body.length > ie6){ //ie 6 은 숫자 request.connection.destroy(); // 접속끊는 함수 } }); request.on('end',function(){ //data가 끝낫을경우 end var post= qs.parse(body); //body 를 쿼리스트링으로 형식바꿈 console.log(post); // queryString 출력 }) response.writeHead(302, {Location: `/?id=${}`}); //요청한 주소로 리다이렉션 response.end('sucess'); });

▼ 내용

request.on('data',function(data){ 는

request로 들어온 데이터를 콜백함수의 data 인자값으로 일정 기준으로 조각내서 넣어준다는 뜻입니다. 조각을 내서 넣어주기때문에 전부 다 받으려고 body += data 를 넣어줍니다.

request.connection.destroy(); 는 접속을 끊는 함수입니다. 위에 if문 조건은

데이터가 일정 크기 이상 들어올경우 접속을 끊는 함수를 사용한겁니다.

request.on('end',function(){ 은 request 데이터를 다 받고나서 작동한다.

body 에 request 받은 모든데이터를 querystring 형식으로 바꿔서 다시 post로 담음

form 데이터 출력형식


◎ URL 데이터 받기 (GET)

//요청이 http://localhost:3000/?id=ohayo 일경우 var url = require('url'); var app = http.createServer(function(request,response){ var _url = request.url; // ?id=ohayo var queryData = url.parse(_url,true).query; // { id: 'ohayo' } var title = queryData.id; // ohayo });

▼ 내용

request 객체에서 url 을 뽑은다음 require('url').parse(리퀘url,true) 를 뽑으면 아래와같이 나온다.

즉 url 에서 ? 앞전꺼 제거한 뒤에 붙은 데이터 get 방식을 객체화 시키는 방법이다.



반응형
반응형

◎ 모듈이란?

▼ 내용

모듈이란 관련된 객체들의 집합소.

어떠한 기능을 수행하기 위해 함수 또는 객체들을 만들어 놨으면.

그걸 한 .js의 파일에 써놓기엔 가독성이나 유지보수가 좋지 않아서 관련 함수 또는 객체들을

.js파일별로 따로 모아놓은것들을 모듈이라고 생각하면 된다.


◎ module.exports

▼ 내용

module.exports의 모듈방법

test.js

var template = { a: 'a', b: 'b' } module.exports = template; //또는 module.exports = { a: 'a', b: 'b' }

abc.js

var template = require('test.js'); console.log(template.a); // a

test.js 처럼 2가지 경우로 module.export 를 사용하여 모듈화를 시킬수 있다.

그 모듈화 시킨걸 abc.js 처럼 가져오는 거다.


◎ exports

▼ 내용

module.exports의 모듈방법

test.js

var template = { a: 'a', b: 'b' } exports.foo = template; //또는 exports.foo = { a: 'a', b: 'b' }

abc.js

var template = require('test.js'); console.log(template.foo.a);//a

test.js 처럼 2가지 경우로 module.export 를 사용하여 모듈화를 시킬수 있다.

그 모듈화 시킨걸 abc.js 처럼 가져오는 거다.


◎ exports 와 module.exports 의 차이점

▼ 내용

일단 간단하게 소스로 설명하자면 exports와 module.exports의 차이점은

var module = { exports: {} }; var exports = module.exports; // your code return module.exports;

이렇게 되는것이다. 결국 exports객체와 module.exports객체는 동일하며

exports 가 module.exports객체를 call by reference 방식으로 바라보고 있으며, 최종적으로 리턴값은 module.exports 라는것이다.

위의 예제중에서 exports는 property 방식을 쓰고 module.exports는 그냥 바로 썻는데

그 이유는 exports를 바로 써버리면 module.exports의 call by reference 관계를 끊어버려서

exports라는 변수가 되버리기 때문이다.

결론

exports 는 property 방식으로 사용

module.exports 는 바로 사용가능

var template = { a: 'a', b: 'b'}; module.exports.foo = template; //(o) module.exports = template; //(o) module.exports = { a: 'a', b: 'b'} // (o) exports.foo = template; //(o) exports = template; //(x) exports = { a: 'a', b: 'b'} // (x)


반응형
반응형

File System 함수를 node js에 가져오는 방법은 require('fs'); 이다.

◎ 파일읽기

▼ 내용

var fs = require('fs'); fs.readFile('sample.txt','utf8',function(err,data){ console.log(data); }); //sample.txt 의 내용 출력

require('fs'); 는 node 모듈에 파일시스템을 가져온다는 의미이다.

fs.readFile 의 첫번쨰 인자는 읽을 파일경로 (현재실행 디렉토리 기준 path 입니다.)

두번째 인자는 문자 캐릭터 (생략시 헥사코드로 나옴 , 바이너리데이터)

세번쨰 인자로 콜백함수를 넣어줬습니다. data 가 읽은 파일의 데이터 입니다.


◎ 파일목록 가져오기

var fs = require('fs'); fs.readdir('./test',function(err,filelist){ console.log(filelist); }); //[ 'css3', 'file.js' ]

▼ 내용

fs 의 readdir 을 쓰면 파일 목록을 배열에 담아서 가져온다


◎ 파일 생성

var fs = require('fs'); fs.writeFile('파일경로/파일명','파일에들어갈내용',function(err){ if (err === null) { console.log('success'); } else { console.log('fail'); } });

▼ 내용

fs.writeFile 의 첫번째인자는 파일명 , 두번째 인자는 파일의 내용 , 세번째는 콜백함수 이다.

콜백함수엔 err을 인자로 줄수있으며 err은 에러가 낫을경우이다.


◎ 파일 이름 수정 , 파일 내용 수정

fs.rename(oldPath, newPath, callback)

▼ 내용

fs.rename(oldPath, newPath, callback)

fs.writeFile 의 첫번째인자는 파일명 , 두번째 인자는 파일의 내용 , 세번째는 콜백함수 이다.

콜백함수엔 err을 인자로 줄수있으며 err은 에러가 낫을경우이다.

예제)

fs.rename(`./data/${title_ori}`,`./data/${title}`,()=>{ //파일 이름 바꾸기 fs.writeFile('./data/'+title,'파일수정할내용','utf8',function(err){ // 파일 내용 수정 if (err ===undefined || err == null){ response.writeHead(302, {Location: `/?id=${title}`}); //요청한 주소로 리다이렉션 response.end(); } }); });

◎ 파일 삭제

fs.unlink(Path, callback)

▼ 내용

fs.unlink(Path, callback)

fs.unlink 의 첫번째인자는 파일경로+파일명, 두번째는 콜백함수 이다.

콜백함수엔 err을 인자로 줄수있으며 err은 에러가 낫을경우이다.

예제)

fs.unlink(`./data/${post.id}`,(err)=>{ console.log(post.id); response.writeHead(302, {Location: `/`}); //요청한 주소로 리다이렉션 response.end(); })

예제)

fs.rename(`./data/${title_ori}`,`./data/${title}`,()=>{ //파일 이름 바꾸기 fs.writeFile('./data/'+title,description,'utf8',function(err){ // 파일 내용 수정 if (err ===undefined || err == null){ response.writeHead(302, {Location: `/?id=${title}`}); //요청한 주소로 리다이렉션 response.end(); } }); });

◎ 동기와 비동기

▼ 내용

파일의 목록을 콘솔에 출력하고 파일의 내용을 콘솔에 출력하고 싶다.

fs.readFile(`data/${queryData.id}`,'utf8',function(err,description){ fs.readdir('./data',function(err,filelist){ console.log(filelist); }) console.log(description); })

위와 같이 작성하면 filelist 가 먼저고 그다음 파일 내용을 출력할것 같지만...

그렇지 않다 실상 출력을 해보면 파일 내용 먼저 출력되고 filelist가 출력이된다.

그 이유는 node js의 함수는 기본적으로 모두 비동기로 처리되기 때문이다.

그래서 위의 readFile 과 readdir 의 메소드들은 모두 비동기로 처리가됬다.

이걸 동기로 바꾸려면

fs.readFile(`data/${queryData.id}`,'utf8',function(err,description){ var filelist = fs.readdirSync('./data'); console.log(filelist); console.log(description); })

이렇게 바꿔야 한다.

node js 의 fs 함수같은경우 비동기 함수와 동기 함수를 모두 제공해준다

대부분 이름을 보면 동기함수 뒤에 Sync 를 붙혀서 제공된다.

단 동기함수같은경운 리턴값을 변수로 받아서 위와같이 작업을 해야한다.

자세한설명은 아래 링크를 참조

https://opentutorials.org/module/938/7373


반응형

+ Recent posts