반응형

◎ 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


반응형
반응형

◎ Template Engine PUG의 장점

▼ 내용

Pug는 요즘 가장 핫한 Node Express Template Engine입니다.

HTML을 간단하게 표현해서 가독성이 좋다.

마크업 문법보다 코드량이 적어 생산성이 좋아진다.

JS 연산 결과를 쉽게 보여줄 수 있다.

정적인 부분과 동적인 부분을 따로 할 수 있다.

타 Express Engine보다 Google Trend 수치가 높다.

Pug는 Jade였다

Pug는 기존에 Jade라는 이름을 가지고 있었습니다. 하지만 이미 상표권이 있는 이름이였기 때문에 Pug라는 이름으로 바꾸게 됩니다.


◎ PUG 라이브러리 설치

▼ 내용

PUG 는 HTML 을 PUG 문법으로 작성하면 HTML 로 바꿔주는 기능을 한다.

pug 는 express의 패키지 view engine이다.

pug는 html파일들을 이쁘게 가공해준다.

pug는 템플릿 언어

npm install pug

설치가 끝나면 views 라는 폴더를 만들고 안에 파일은 .pug 라는 확장자를 붙인다

그이후 app.js 에 아래와같이

app.set('view engine' , 'pug');

그리고 라우터 응답받는곳에 아래처럼 적으면 /home 경로는 home.pug 로 연결된다

const home = (req,res) => res.render('Home'); //const home = (req,res) => res.send('Home');

만약 views/ 폴더가아닌 다른 폴더에서 view템플릿을 찾을려면

app.set('views','바꿀폴더명'); 으로 정의 해줘야한다

app.set(view engine 은 view의 확장자 ​

app.set(views 은 view의 폴더명

◎ pug의 문법

▼HTML 작성법

아래 소스와 같이

탭을 하면 안에 자식 노드가되고

탭을 안하면 동등한 형제 노드가 된다.

닫는 태그는 따로 할필요없이 다음 태그를 적으면 알아서 된다.

//main.pug doctype html html head title Wetube body main block content footer span &copy: WeTube

 ( extends : 상속후 컨텐츠 추가)

pug는 레이아웃으로 짜둔 .pug 를 extends 파일경로 써줘서

레이아웃 .pug 들을 상속? 같은걸 받을수 있다.

위에서 작성한 레이아웃을 상속받아서 block content 의 부분을 p Hello 로 바꿔준 것.

만약 extends 를 하는 파일에 block 을 적어주지 않으면 에러가난다

//home.pug extends layouts/main block content p Hello!!

▼ PARTIALS ( include : spring tiles 같은 것)

이것도 spring tiles 와 비슷하다 다른 파일을 이 html 안에 갖고오는것이다.

extends 와 차이점이라면 extends는 상속받아서 block 부분을 새로 작성하는것이고

include는 그냥 있는 그대로 껴넣는다

include ../partials/footer

​ 태그의 class 이름 추가 방법

PUG 는 HTML 코드로 작성해도 상관없다

PUG의 문법으로 할려면 HTML 태그의 속성들은 () 안에 넣어야하고 각 콤마를 넣어야한다

link.babo_blo (rel="stylesheet", href="../babo") <link rel="stylesheet" href="../babo class="babo_blo"> .footer__icon <div class="footer__icon"></div>

​ javascript 작성법

#{ } 안에 javascript 문법을 적으면된다.

실행시키고 개발자도구로보면 결과값만 나온다.

#{new Date().getFullYear()} //현재 년도 구하는 javascript 코드


반응형
반응형

middleware 란?

요청 url 의 response를 받기 전에

실행할 함수들? 그런걸

middleware 라고 한다.

java spring의 intecepter 와 똑같은 역할

◎ middleware 의 예제

▼ 내용

아래 소스 처럼 between hom 을 출력하는 함수를 하나 만들어주고

그걸 express의 라우팅 함수의 가운대 인자로 함수를 집어 넣고

함수의 next() 를 넣어주면 handlehome 의 요청 함수로 가기전에

betweenhome 을 실행 시킬수 있다.

이걸로 로그인정보, 파일다운로드 등등 중간에 인터셉터해서 사용할수있다.

안에 middleware는 많은 갯수제한없이 많이 넣을수 있다.

middleware 의 함수에 next() 를 넣어줘야 다음함수로 진행이된다 안넣으면 에러.

만약 middleware 에 next() 를 안넣고 res.send로 다른걸 받아서 연결을 끊을 수도 있다.

const app = express(); const betweenHome = (req,res,next) => { console.log("between hom") next(); }; const handlehome = (req,res) => res.send("Hello From Home"); } app.get('/',betweenHome,handlehome); //요청 url / 에 들어갈떄마다 betweenhome 함수가 실행된다 .

◎ middleware 의 또다른 예제

▼ 내용

middleware 는 app.get 또는 app.post의 인자로 넣어줄수도 있지만

app.use 로 .use 라는 메소드를 통해 모든 요청 url에 대하여 설정해줄수도 있습니다.

라우팅 메소드 전에 써줘야 그 라우팅에 대헤서만 작동하고

app.use 이전에 쓴 라우팅 메소드들에 대헤선 동작하지 않는다

app.get('/profile',handleProfile); app.use(betweenHome); app.get('/',handlehome); // 이럴 경우 /profile 로 들어온건 app.use 가 동작하지 않는다


◎ middleware 의 라이브러리1 (morgan)

▼ 내용

morgan 은 logging 할때 유용한 패키지 이다.

application 에서 발생하는 모든일을 logging (콘솔출력) 해준다

npm install morgan

설치후 사용방법은 app.use(morgan("")); 다

import morgan from "morgan"; app.use(morgan("tiny"))

morgan 의 인자로는 combined , common , dev , short , tiny 를 사용할수 있다.​

tiny : 접속종류(get/post) , http상태코드 , 로딩시간 을 알 수 있다. (ex GET /profile 304 - - 0.397 ms)

combined : 접속종류(get/post) , 브라우저 종류 , 접속날짜 등등

common : 접속날짜 , 접속종류 , 상태코드 등

dev : 상태코드 , 접속종류 , 로딩시간 등

short : 상태코드 접속종류 로딩시간 등





◎ middleware 의 라이브러리2 (helmet)

▼ 내용

node.js 앱의 보안에 도움이되는 라이브러리. 앱을 안전하게 해준다

nosniff , nocache , ieNoOpen , xssFilter 등등 을 지원해준다

설치법

npm install helmet

사용법

import helmet from "helmet"; app.use(helmet());

​기본적으로 해놓는것이 좋다.


◎ middleware 의 라이브러리3 (cookie parser)

▼ 내용

cookie 를 전달받아서 사용할 수 있도록 만들어주는 미들웨어

사용자 인증 같은 곳에서 쿠키를 검사할때 사용

설치법

npm install cookie-parser

사용법

import cookieParser from "cookie-parser";

​기본적으로 해놓는것이 좋다.


◎ middleware 의 라이브러리4 (body parser)

▼ 내용

사용자가 웹사이트로 전달하는 정보들을 검사하는 미들웨어 request 에서 form 이나 json 형태로 된 정보를 접근하는 미들웨어 cookie-parser 와 같이 작동해서 세션에 정보를 담을수 있다.

설치법

npm install body-parser

사용법

import bodyParser from "body-parser"; app.use(bodyParser.json()); 또는 app.use(bodyParser.urlencoded({extended:true})); //중첩객체허용 app.post('/create_process',(request,response) => { console.log(request.body); } //{ title: 'abcd', description: 'efgh' }

위처럼 app.use 를 설정하면 get,post로 들어온 request의 값들을 body 프로퍼티를 추가해 위처럼자동으로 객체화 시켜준다. 사용할땐 request.body를 쓰면된다.

▼ [extended 옵션]

extended 는 중첩된 객체표현을 허용할지 말지를 정하는 것이다. 객체 안에 객체를 파싱할 수 있게하려면 true. 내부적으로 true 를 하면 qs 모듈을 사용하고, false 면 query-string 모듈을 사용한다. 이 두 모듈간의 차이에서 중첩객체 파싱여부가 갈린다. querystring.parse는 object를 상속받지 않는다. 따라서 toString()와 hasOwnProperty() 등이 사용불가능해진다

express 자체에도 있어서 구지 설치할 필요는 없다. 아래는 express의 body parser 사용하는 방법

app.use (express.urlencoded ({extended : true})); app.use (express.json ());

◎ express 의 url 추가맵핑

▼ 내용

app.use로 중간에 인터셉터해서 함수를 실행할수 있다고 말했다.

이걸 이용해서 abc/index , abc/abcd , abc/correction 이렇게

url 앞에 맵핑하는법을 설명하겠다.

router.js

import express from "express"; export const userRouter = express.Router(); userRouter.get("/",(req,res) => res.send('user index')); userRouter.get("/edit",(req,res) => res.send('user edit')); userRouter.get("/password",(req,res) => res.send('user password'));

app.js

import { userRouter } from "./router"; app.use('/user',userRouter);

이렇게 import,export 로 모듈화시켜서 app.use 에 모듈을 집어 넣으면

모듈에 정의된 함수가 /user/* 이렇게 정의된대로 url 맵핑이 된다.

추가로 URL의 :URL 이렇게 적으면 :URL 은 변수 URL 로 인식한다 (express 에서)


◎ 뷰템플릿 글로벌변수

▼ 내용

app.use를 활용하여 .pug에 변수를 사용할수 있다.

즉 app.use에 할당된 함수의 지역변수를 뷰템플릿 어디서나 사용할수있도록 하기 위함이다.

설명은 너무기니 소스를 참고하면 된다

app.js

import { localsMiddleware } from "./middlewares"; app.use(localsMiddleware);

middlewares.js

export const localsMiddleware = (req,res,next) => { res.locals.siteName = "WeTube"; res.locals.routes.login = "/login"; next(); }

footer.pug

a(href=routes.login) Login span.footer__text #{siteName}

이렇게 middlewares.js의 req,res,next 를 받아서 함수로 작성하고

(함수안에 마지막엔 next(); 를 꼮써야 한다.

res.locals 는 express에서 지원해주는객체로 rex.locals.xxx <-- 여기에 변수명을 준다.

그리고 그 변수를 export 해준다음 app.js 에 import 해서

app.use(함수명) 을 써주면 어느곳에서나 #{변수명} 을 적어주면 된다.

태그의 속성 () 안에 있는 경우엔 =변수명 이렇게 쓰면된다



반응형

+ Recent posts