Express미들웨어 모듈-미들웨어 모듈-데이터 퍼싱:body-parser미들웨어-데이터 압축:compression미들웨어-쿠키 관리:cookie-parser미들웨어-쿠키 세션:cookie-session미들웨어-세션 관리:express-session미들웨어-CORS관리:cors미들웨어-로깅 관리:morgan미들웨어-파일 업로드:multer미들웨어-코드 실행 시간 측정:response-time미들웨어-타임 설정:conect-timeout미들웨어 선행할 필요가 있습니다. https://blog.naver.com/hj_kim97/222913693753
미들웨어 모듈 Express는 웹 서버 운영을 위한 다양한 미들웨어 모듈을 제공합니다.

미들웨어 모듈 설명 body-parserHTTP요청 bot을 퍼싱합니다. ·내장 함수:express.body Parser compression HTTP요구를 압축합니다. ·내장 함수:express.compressconnect-rid고유의 리퀘스트 ID를 생성합니다.cookie-parser쿠키 헤더를 퍼싱, req.cookies에 할당합니다. ·내장 함수:express.cookieParsercookie-session쿠키 기반의 세션을 작성합니다. ·내장 함수:expresscookieSessioncors여러가지 옵션을 이용하고 Cross-origin resource sharing(CORS)을 활성화합니다.errorhandler개발 중에 발생하는 오류를 처리하고 디버깅 합니다. ·내장 함수:express.error Handlermethod-override헤더를 이용하고 HTTP method를 덮어 씁니다. ·내장 함수:express.methodOverridemorgan HTTP요구 로그를 남깁니다. ·내장 함수:express.loggermultermulti-part폼 데이터를 처리합니다. ·내장 함수:express.bodyParserresponse-time응답 시간을 기록합니다. ·내장 함수:express.responseTimeserve-favicon화비콤을 제공합니다. ·내장 함수:express.faviconserve-index 주어진 패스의 디렉토리 리스트를 제공합니다. ·내장 함수:express.directoryserve-static정적 파일을 제공합니다. ·내장 함수:express.staticsession서버 기반의 세션을 작성합니다. ·내장 함수:express.sessiontimeoutHTTP요구 처리를 위한 timeout를 작성합니다. ·내장 함수:express.timeoutvhost가상 도메인을 작성합니다. ·내장 함수:express.vhost
body-parser미들웨어 body-parser미들웨어는 클라이언트가 POST방식으로 요구할 때, 본문 영역에 들어간 요구 파라미터를 퍼싱어 요구 객체의 bodt속성에 넣습니다. 간단히 body-parser는 리퀘스트 본문 구문을 해석하고 req.body속성으로서 내줘미들웨어입니다. ·클라이언트로부터 수신하는 데이터 중, 멀티 파트는 처리할 수 없습니다. multi-part의 경우 multer모듈을 사용하고 처리할 수 있습니다. ·클라이언트로부터 받는 데이터의 유형은 크게 json, raw, text, urlencode이 있습니다. ·Express 4.16이상 버전에서는 body-parser기능이 익스프레스에 내장되어 있습니다. 이전 버전에서는 npm install body-parser에서 설치가 필요합니다. ··공식 문서:https://www.npmjs.com/package/body-parser

body-parser 미들웨어 body-parser 미들웨어는 클라이언트가 POST 방식으로 요구할 때 본문 영역에 들어 있는 요구 파라미터를 파싱하여 요구 객체의 bodt 속성에 넣습니다. 간단하게 body-parser는 요청 본문 구문을 해석하여 req.body 속성으로 사용할 수 있게 해주는 미들웨어입니다. · 클라이언트로부터 수신하는 데이터 중 멀티 파트는 처리할 수 없습니다. multi-part의 경우 multer 모듈을 사용하여 처리할 수 있습니다. · 클라이언트로부터 받는 데이터 유형은 크게 json, raw, text, urlencode가 있습니다. · Express 4.16 이상의 버전부터는, body-parser 기능이 익스프레스에 내장되어 있습니다. 이전 버전에서는 npm install body-parser로 설치가 필요합니다. · · · 공식 문서 : https://www.npmjs.com/package/body-parser
body-parser 특정 라우터에만 적용함

constexpress=requireexpress”;constapp=express();//json이터파-을-body-parserconstjson=express.json();//urlencodedser위한bodyconst을url:loginpostextendedbody-parserconsturlcodedParser=express.urlencodedextended:fal};//’언’/트로로요enc청(의는url터oded터부postfunction터된.send(‘welcome,’+req.body.username);};//라이언트로.apipost터POST으된로’/요/api/users’터터의sonjjsonParser/api/app.post(‘/api/users’,jsonParser,function(req,res){//req.body);}득획자보정서사에용’}};
compression미들웨어 Compression은 압축을 위한 미들웨어에서 주어진 옵션을 사용하여 서버로부터 클라이언트에 응답하는 응답 본문을 압축합니다. 통상 파일처럼 응답하는 데이터의 사이즈가 큰 경우에 사용합니다. ·Express의 최상위로 use()함수를 사용하고 Compression을 정의할 경우 응답하는 모든 데이터가 압축됩니다. ·공식 문서:http://expressjs.com/en/resources/middleware/compression.html(응답하는 모든 데이터가 압축되어 데이터 사이즈가 작아져서도 일반적인 작은 사이즈의 json텍스트 데이터의 경우 압축에 걸리는 시간으로 클라이언트에 응답하는 전체 시간이 증가할 가능성이 있습니다. 그 때문에, 클라이언트에서 요청된 응답하는 데이터 타입(화상 파일, 지도 데이터,..등)에 따라서 Compression을 적용할 것을 추천합니다.→ npm설치압축 #압축★★★½→ npm설치압축 #압축★★★½const compression=require(‘Compression’);const express=require(‘express’);constapp=express();//클라이언트에 요구된 라우터가 ‘/api/getMap’의 경우에만 응답 데이터를 압축합니다. app.use(‘/api/getMap’, compression();//응답하는 모든 데이터가 압축됩니다.////app.use(compression();cookie-parser미들웨어 cookie-parser미들웨어를 사용하면 쿠키를 설정하거나 확인할 수 있습니다. 쿠키는 클라이언트의 웹 브라우저에 보존되는 정보에서 일정 기간 보존하고 싶을 때에 사용합니다.만약 암호화된 쿠키를 사용하려면 cookieParser()메소드의 인자로서 임의의 문자열(secret key)을 전달하면 됩니다. ·secret문자열을 전달하고 선택적으로 서명된(signed)쿠키 지원을 활성화할 수 있습니다. ·secret문자열은 다른 미들웨어에서 사용할 수 있도록 req.secret를 할당합니다. ··공식 문서:http://expressjs.com/en/resources/middleware/cookie-parser.html→ npm install cookie-parser#cookie-parser모듈 설치 쿠키 생성 옵션·maxAge:유효 기간을 밀리초 단위로 설정·expires:유효 기간을 GMT시간으로 설정·path:cookie경로(default:’/’)·domain:도메인 네임(default:’loaded’)·secure:htps에서만 cookie사용할 수 있도록 합니다.·httpOnly:웹 서버에서만 cookie접속할 수 있도록 합니다.·signed:cookie가 서명을 지정합니다.(마이 서버가 쿠키를 만들었다는 검증)#쿠키 생성:res.cookie(cookieName, cookieValue[, options]);#쿠키 확인:req.cookies, req.signedCookies#쿠키 삭제:res.clearCookie(cookieName[, options]);→ npm install cookie-parser # cookie-parser 모듈 설치 쿠키 생성 옵션, maxAge : 유효기간을 밀리초 단위로 설정, expires : 유효기간을 GMT 시간으로 설정,path:cookie의 경로(default: ”/”) · domain: 도메인 네임(default: ‘loaded’) · secure: https에서만 cookie 사용이 가능하도록 합니다. · httpOnly: 웹 서버에서만 cookie 접근이 가능하도록 합니다. · signed:cookie가 서명을 지정합니다. (내 서버가 쿠키를 만들었다는 검증) #쿠키 생성:res.cookie(cookieName, cookie Value[, options]; #쿠키 확인:req.cies,varcookieParser=require”cookie(‘-parser’;varexpress=require”express'”;app.use(cookieParser();//cookie-parser””//””app.get”/””, function(req, res){//키목인확록:cookies(:서명되지 않은 쿠키. log(‘Cookies:’, req.);//();//(console””cookie:서명 후 로그.ookies:’, req.signedCookies);res.send(‘CookieShow’);};//””cookie””:res.cookie(cookieName, cookieValue, options);app.post”/””, 함수(req, res){constdays=1;//””res.””data2″”,{message:”HelloCookie-Parser”, num:100};name”, res”, resDate.now()+days*24*60*60*1000)//키의 date만 only을일하 http설뒤 httpOnly:true, secure:true});res.send(‘CookieCreate’;};//쿠삭제:res//cook:res.clearCookie(cookieName, options);//을하였설다면정삭제키쿠며(exp,’하션 max하도(옵치 delete를 cook여 ires일야//ageies,/, app*의*정 resres.clearCookie(‘name’,’hj_kim97′,{httpOnly:true, secure:true});res.send(‘CookieDelete’);});app.listen(3000, function(){console.log(‘Expressserverlisteningonport’+3000);});varcookieParser=require”cookie(‘-parser’;varexpress=require”express'”;app.use(cookieParser();//cookie-parser””//””app.get”/””,function(req,res){//키목인확록:cookies(:署名されていないクッキー.log(‘Cookies:’,req.);//();//(console””cookie:署名済みのログ。ookies:’,req.signedCookies);res.send(‘CookieShow’);};//””cookie””:res.cookie(cookieName,cookieValue,options);app.post”/””,関数(req,res){constdays=1;//””res.””data2″”,{message:”HelloCookie-Parser”,num:100};name”,res”,resDate.now()+days*24*60*60*1000)、//키의date만only을일하http설뒤httpOnly:true,secure:true});res.send(‘CookieCreate’;};//쿠삭제:res//cook:res.clearCookie(cookieName,options);//을하였설다면정삭제키쿠며(exp,’하션max하도(옵치delete를cook여ires일야//ageies,/,app*의*정resres.clearCookie(‘name’,’hj_kim97′,{httpOnly:true,secure:true});res.send(‘CookieDelete’);});app.listen(3000,function(){console.log(‘Expressserverlisteningonport’+3000);});Signed Cookie보안 쿠키 데이터가 노출되지 않도록 구현된 쿠키 Signed Cookie을 생성하는 방법 1.cookie Parser()의 인자에 비밀 키 문자열을 추가합니다.2. 쿠키 데이터를 선언하고 값을 할당할 때’signed:true’옵션을 추가합니다. 3. 생성된 쿠키는 req.signedCookies에서 것으로 가능합니다.———————————————————————————————————————————————————-//1. 비밀키 적용 app.use(cookieParser(‘Secret Key’);//2. Signed Cookie생성 res.cookie(‘signedData’,’비밀의쿠키’,{httpOnly:true, secure:true, signed:true});//3. Signed Cookie것으로 console.log(‘Signed Cookies:’, req.signedCookies);———————————————————————————————————————————————————-cookie-session미들웨어 cookie-session미들웨어는 간단한 쿠키 기반의 세션 관리 미들웨어입니다.cookie-session모듈은 쿠키 안에서 클라이언트 세션 데이터를 저장하지만 express-session은 일반적으로 쿠키 안에 클라이언트 세션 식별자만 보존하고 서버 세션 데이터가 데이터베이스 또는 서버 파일에 저장합니다.·cookie-session은 브라우저의 최대 쿠키 사이즈 내에서만 보존하지만 서버 측 데이터베이스와는 다른 자원이 필요 없다는 장점이 있습니다. ··공식 문서:http://expressjs.com/en/resources/middleware/cookie-session.html→ → npminstallcookie-module#cookie-module듈치설→ → npminstallcookie-module#cookie-module듈치설varcookieSession=require”quire”-quire’;constexpress=require”quire”quire”);constapp=express();app.use(cookieSession({name:’scret’, keys:[‘SecretKey’]), maxAge:24*60*60*1000/24quire’);app.get’/’, 함수(req, res, res, res, next){//viewsreqviews=(req.req.express.)views|| 0)+1//writeresponseres.end(req.session). 뷰+’뷰’};app.listen(3000, function(){console.log(‘Expressserverlisteningonport’+3000);});express-session미들웨어 express-session는 세션을 관리하기 위한 미들웨어입니다. 이 세션은 cookie-session과 달리 데이터를 서버에 저장하기 때문에 쿠키보다 안전하고 더 많은 데이터를 보존할 수 있습니다. ··공식 문서:http://expressjs.com/en/resources/middleware/session.html→ npm install express-session#express-session모듈 설치 쿠키 생성 옵션·secret:보안을 위한 임의의 문자열(secret key)·resave:세션 데이터가 바뀔 때까지 세션 스토리지의 값을 저장 여부(default:false)·save Uninitialized:세션이 필요하게 되기 전에 세션을 구동할지(default:true)·store:세션 스토리지를 지정→ npm install express-session #express-session 모듈 설치 쿠키 생성 옵션, secret: 보안을 위한 임의 문자열(secret key), resave: 세션 데이터가 바뀔 때까지 세션 스토리지 값 저장 여부(default:false), save Uninitialized: 세션이 필요하기 전에 세션 구동 여부(default: true), store: 세션 스토리지 지정const express=require(‘express’);const bodyParser=require(‘body-parser’);var session=require(‘express-session’);const app=express();app.use(express.urlencoded({extended:false});app.use(express.json();app.use(session({secret:’secret key’,//보안을 허브로 만들기 위한 임의의 문자열 resave:false//세션에 변경 사항이 없어도 항상 다시 저장할지 여부 saveUninitialized:true//초 기화되지 않은 세션을 스토어(스토리지)에 강제로 보존할지 cookie:{//세션 쿠키 설정(세션 관리 클라이언트에 보내쿠키)htpOnly:true//true라면 클라이언트 자바 스크립트에서 document.cookie에서 쿠키 정보를 볼 수 없는 secure:false//true라면 htps환경에서만 쿠키 정보를 교환하게 처리 maxAge:60000//쿠키가 유지되는 시간(ms)}});app.get(‘/session’, function(req, res){console.log(req.session.user);res.send(‘Session:’+req.session.user);});app.post(‘/session’, function(req, res){var paramId=req.body.id|| req.query.id;var paramPassword=req.body.password|| req.query.password;req.session.user={id:paramId, authorized:true};res.send(‘Create Session’);});app.delete(‘/session’, function(req, res){req.session.destroy(function(err){if(err){throw err;}console.log(‘Delete Session’);res.redirect(‘http://localhost:3000/session’);});});app.listen(3000, function(){console.log(‘Express server listening on port’+3000);});const express=require(‘express’);const bodyParser=require(‘body-parser’);var session=require(‘express-session’);const app=express();app.use(express.urlencoded({extended:false});app.use(express.json();app.use(session({secret:’secret key’,//보안을 허브로 만들기 위한 임의의 문자열 resave:false//세션에 변경 사항이 없어도 항상 다시 저장할지 여부 saveUninitialized:true//초 기화되지 않은 세션을 스토어(스토리지)에 강제로 보존할지 cookie:{//세션 쿠키 설정(세션 관리 클라이언트에 보내쿠키)htpOnly:true//true라면 클라이언트 자바 스크립트에서 document.cookie에서 쿠키 정보를 볼 수 없는 secure:false//true라면 htps환경에서만 쿠키 정보를 교환하게 처리 maxAge:60000//쿠키가 유지되는 시간(ms)}});app.get(‘/session’, function(req, res){console.log(req.session.user);res.send(‘Session:’+req.session.user);});app.post(‘/session’, function(req, res){var paramId=req.body.id || req.query.id;var paramPassword = req.body.password || req.query.password; req.session.user = { id: paramId, authorized: true}; res.send(‘Create Session’);});app.delete(‘/session’, function (req, res) { req.session.destroy(function (err) {if (err) { throw err; } console.log(‘Delete Session’); res.redirect(‘http://localhost:3000/session’);});});app.listen(3000, function() { console.log(‘Express server listening on port ‘ + 3000);});const express=require(‘express’);const bodyParser=require(‘body-parser’);var session=require(‘express-session’);const app=express();app.use(express.urlencoded({extended:false});app.use(express.json();app.use(session({secret:’secret key’,//보안을 허브로 만들기 위한 임의의 문자열 resave:false//세션에 변경 사항이 없어도 항상 다시 저장할지 여부 saveUninitialized:true//초 기화되지 않은 세션을 스토어(스토리지)에 강제로 보존할지 cookie:{//세션 쿠키 설정(세션 관리 클라이언트에 보내쿠키)htpOnly:true//true라면 클라이언트 자바 스크립트에서 document.cookie에서 쿠키 정보를 볼 수 없는 secure:false//true라면 htps환경에서만 쿠키 정보를 교환하게 처리 maxAge:60000//쿠키가 유지되는 시간(ms)}});app.get(‘/session’, function(req, res){console.log(req.session.user);res.send(‘Session:’+req.session.user);});app.post(‘/session’, function(req, res){var paramId=req.body.id || req.query.id;var paramPassword = req.body.password || req.query.password; req.session.user = { id: paramId, authorized: true}; res.send(‘Create Session’);});app.delete(‘/session’, function (req, res) { req.session.destroy(function (err) {if (err) { throw err; } console.log(‘Delete Session’); res.redirect(‘http://localhost:3000/session’);});});app.listen(3000, function() { console.log(‘Express server listening on port ‘ + 3000);});varescapeHtml=requireescape-html’)varexpress=requireexpress’)’)varsession=requireexpress-‘)’)varapp=expressappapp.use(“비밀:’keyboardcat’, resave:false, saveUninitialized:true})//미들웨어. 인증된 함수가 Authenticated(req, res, next){if(req.session.user)next()elsenext(‘route’)}app.get(‘/’, isAuthenticateditedres.send(‘hello,’+escape)’)})에 의한 인증된 인증된 사용자가 있는 경우에만부르는 Html(req.session.user)+’!’+'<ahref=”/logout”>Logout</a>’}app.get(‘/login’, function(req, res){res.send(<formaction=”/login”method=”post”>’+’사용자명:<inputname=”user”><br>’+’비밀 번호:<inputtype=”password”><br>+'<inputtype”text=”Login”></form>’}app.postvlog/login’, express.urlencodedvloginextended:false}), req.body.user및 req. body.pass//를 검증하는 함수(req, res){//로그 인 논리가 여기에 구현됩니다. 이 예에서는 임의의 콤보 워크//세션을 다시 생성합니다. 이는 세션 고정 req.req.req.regenerate(function(err){if(err)next(err)}//세션 내의 유저 정보를 저장합니다.통상은 방향 수정 전에 세션을 보존해서 페이지//로드합니다.세션이 보존되기 전에 oes가 발생하지 않습니다 req.save(함수(err){if(err)returnnext(err)res.(‘redirect/’}}})app.get(‘//logout’, 함수(req, res, next){//logoutlogoutlogic///)을 Session객체에서 삭제하고 저장합니다.//앞으로 오래 된 세션 ID//를 재사용할 때에 로그인한 userreq.req.user=null이 아닌 것으로 확인됩니다.lreq.php.save(함수(err){if(err)next(err)//세션을 다시 생성합니다.이는 세션 고정 req.php.php.phprate(함수(err){if(err)next(err)res.php/php’)}}}}}app.listen(3000)의 형식으로//보호하는데 도움이 됩니다.session-file-store모듈 session-file-store모듈을 사용하면 세션 정보를 파일로 저장하고 관리할 수 있습니다.프로젝트 폴더에 세션 즈포루다이 작성되어 그 폴더의 하위에 세션에 관한 정보 파일이 작성됩니다. → → npm install session-file-store#session-file-store모듈 설치———————————————————————————————————————————————————-const express=require(‘express’);const session=require(‘express-session’);const bodyParser=require(‘body-parser’);const fileStore=require(‘session-file-store’)(session);const app=express();app.use(bodyParser.urlencoded({extended:false});app.use(session({secret:’Secret Key’, resave:false, saveUninitialized:true, cookie:{httpOnly:true, maxAge:60000}, store:new fileStore//세션 저장소로 fileStore사용});app.get(‘/’,(req, res, next)=>{console.log(req.session);res.send(req.session);});//로그인 요청시에 유저 정보를 확인한 후, 세션에 사용자 정보 보존 app.post(‘/login’,(req, res, next)=>{//email, pw를 파라미터로서 받은 const<email, pw}=req.body.param;//DB사용자 정보를 조회하고 로그인 인증 코드를 작성//로그인 성공시에 유저 정보 세션에 저장 req.session.email=email;//사용자 메일 정보 req.session.is_logined=true;//로그인할지 req.session.save(function(err){if(err)next(err)res.redirect(‘/home’);});//로그아웃 요청시에 세션 삭제 후 로그인 페이지로 이동 app.post(‘/logout’,(req, res, next)=>{req.session.destroy();res.redirect(‘/login’);})app.listen(3000,()=>{console.log(‘Express server listening on port’+3000);});————————————————————————————————————————————————-cors미들웨어 CORS(Cross-Origin Resource Sharing)은 추가 HTTP헤더를 사용하여 도메인 또는 포트가 다른 서버의 리소스 액세스 권한을 부여하도록 브라우저에 알리는 체제의 일입니다. 통상 Node.js에서 웹 서버를 구성할 경우 클라이언트와 도메인 또는 포트가 각각의 서버로 구동됩니다. 그 때문에, 클라이언트의 리퀘스트는 브라우저의 보안 상의 문제에 의한 정상적으로 접근할 수 없습니다.·CORS도메인과 포트를 지정하고 권한 있는 클라이언트만 접근할 수 있도록 접근 권한을 부여·관리할 수 있는 미들웨어입니다.·Cross-Origin과 다른 Origin(출처)입니다. 즉, 프로토콜, 도메인, 포트의 어느 하나라도 다르면 다른 Origin(출처)으로 인식하고 CORS설정을 하지 않으면 접근하지 못하도록 되어 있습니다. ··공식 문서:http://expressjs.com/en/resources/middleware/cors.htmlcors 미들웨어 CORS(Cross-Origin Resource Sharing)는 추가 HTTP 헤더를 사용하여 도메인 또는 포트가 다른 서버의 리소스에 액세스할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제를 말합니다. 일반적으로 Node.js에서 웹 서버를 구성하는 경우 클라이언트와 도메인 또는 포트가 별도의 서버에서 구동됩니다. 따라서 클라이언트 요청은 브라우저 보안 문제로 정상적으로 접근할 수 없습니다. ·CORS 도메인과 포트를 지정하여 권한 있는 클라이언트만 접근할 수 있도록 접근 권한을 부여 관리할 수 있는 미들웨어입니다. ·Cross-Origin과 다른 Origin(출처)을 말합니다. 즉, 프로토콜, 도메인, 포트 중 하나라도 다르면 다른 Origin(출처)으로 인식해 CORS 설정을 하지 않으면 액세스할 수 없게 되어 있습니다. · · · 공식 문서 : http://expressjs.com/en/resources/middleware/cors.html→ npm install cors#cors모듈 설치 CORS옵션·origin:허용하는 도메인·method:허용하는 HTTP요구(ex.[‘GET’,’POST’,’PUT’,’DELETE’])·allowed Headers:접근 허가하는 CORS요구 헤더 정보(ex.[‘Content-Type’,’Authrization’])·exposed Headers:접근 허가하는 CORS응답 헤더 정보(ex.[‘Content-Range’,”]er-Allow-method)헤더에 포함된 정보를 캐시 할 수 있는 기간·preflightContinue:CORS실행 전의 응답을 다음 장치로 전송할지…optionsSuccessStatusOPTIONS:일부레거시 브라우저(ex. IE11)에서 분필에 접속되어 요구에 성공하는 스테이터스 코드→ npm install cors#cors모듈 설치 CORS옵션·origin:허용하는 도메인·method:허용하는 HTTP요구(ex.[‘GET’,’POST’,’PUT’,’DELETE’])·allowed Headers:접근 허가하는 CORS요구 헤더 정보(ex.[‘Content-Type’,’Authrization’])·exposed Headers:접근 허가하는 CORS응답 헤더 정보(ex.[‘Content-Range’,”]er-Allow-method)헤더에 포함된 정보를 캐시 할 수 있는 기간·preflightContinue:CORS실행 전의 응답을 다음 장치로 전송할지…optionsSuccessStatusOPTIONS:일부레거시 브라우저(ex. IE11)에서 초크에 연결되므로 요청에 성공하는 상태 코드morgan 미들웨어 morgan은 HTTP 요청에 대한 로그를 관리하는 미들웨어입니다. · · · 공식 문서 : http://expressjs.com/en/resources/middleware/morgan.html→ npm install morgan#morgan모듈의 설치#morgan미들웨어 등록:morgan(format, options)·format:미리 정의된 이름의 문자열 형식 문자열 또는 로그 항목을 생성하는 함수#format combined:운영 환경에서 사용, 불특정 다수가 접속하므로 IP을 로그로 남깁니다.->:remote-addr-:remote-user[:date[clf]]”:method:url HTTP/:http-version”:status:res[content-length]”:referrer””:user-agent”common->:remote-addr-:remote-user[:date[clf]]”:method:url HTTP/:http-version”:status:res[content-length]dev:개발용을 위해 response에 따라 색상이 입혀진 축약된 로그를 출력합니다.->:method:url:status:response-time ms-:res[content-length]short:기본 설정보다 짧은 로그를 출력합니다.(응답 시간 포함)->:remote-addr:remote-user:method:url HTTP/:http-version:status:res[content-length]-:response-time mstiny:최소화된 로그를 출력합니다.->:method:url:status:res[content-length]-:response-time ms→ npminstallmorgan #morgan모듈설치 #morgan미들웨어등록 : morgan(format,options) · format: 미리 정의된 이름의 문자열, 형식 문자열 또는 로그 항목을 생성하는 함수 # format combined: 운영환경에서 사용, 불특정 다수가 접속하기 때문에 IP를 로그에 남깁니다. -> : remote-addr – : remote-user [:date[clf]” : method : http/:http:remote-addr-:remote-user[:date[clf]]”:method:url HTTP/:http-version”:status:res[content-length]dev:개발용을 위해 response에 따라 색상이 입혀진 축약된 로그를 출력합니다.->:method:url:status:response-time ms-:res[content-length]short:기본 설정보다 짧은 로그를 출력합니다.(응답 시간 포함)->:remote-addr:remote-user:method:url HTTP/:http-version:status:res[content-length]-:response-time mstiny:최소화된 로그를 출력합니다.->:method :url :status :res[content-length] – :response-time msconstexpress=require(“path”);constpath=require(“path”);constmorgan=require(“path”);constapp=express();app.set(“port’,process.env)PORT||3000);//”””””if(process.env.””NODE_ENV===’production’){//영인환node우appapp.use((‘combined”);} else{//발인경app우(경app.use(“devdev'”);}app.get”/’,(req,res)={res.send”hello,world!’);};app.listen(app.get”port’),()={console.log(‘Expressserverlisteningonport’+app.get(port’);});constexpress=require(“path”);constpath=require(“path”);constmorgan=require(“path”);constapp=express();app.set(“port’,process.env)PORT||3000);//”””””if(process.env.””NODE_ENV===’production’){//영인환node우appapp.use((‘combined”);} else{//발인경app우(경app.use(“devdev'”);}app.get”/’,(req,res)={res.send”hello,world!’);};app.listen(app.get”port’),()={console.log(‘Expressserverlisteningonport’+app.get(port’);});constexpress=require(“path”);constpath=require(“path”);constmorgan=require(“path”);constapp=express();app.set(“port’,process.env)PORT||3000);//”””””if(process.env.””NODE_ENV===’production’){//영인환node우appapp.use((‘combined”);} else{//발인경app우(경app.use(“devdev'”);}app.get”/’,(req,res)={res.send”hello,world!’);};app.listen(app.get”port’),()={console.log(‘Expressserverlisteningonport’+app.get(port’);});multer미들웨어 multer는 multi-part/form-data데이터를 처리하기 위한 미들웨어입니다. 쉽게, 클라이언트로부터 송신된 파일을 서버에 올릴 수 있는 미들웨어입니다.·Multer는 multipar(multipart/form-data)가 아닌 폼이 동작하지 않습니다. ··공식 문서:http://expressjs.com/en/resources/middleware/multer.html→ npm install multer # multer모듈설치→ npm install multer # multer모듈설치<formaction=”/profile”method=”post”enctype=”multipart/form-data”><入力タイプ=”file”name=”file”/></form><formaction=”/profile”method=”post”enctype=”multipart/form-data”><入力タイプ=”file”name=”file”/></form><formaction=”/profile”method=”post”enctype=”multipart/form-data”><入力タイプ=”file”name=”file”/></form>1. 디스크 저장 위치 설정 multer모듈을 사용하여 클라이언트로부터 송신된 파일을 업로드 처리하려면 먼저 디스크 저장 위치에 대한 객체를 작성할 필요가 있습니다.multer의 리스크 스토리지()함수를 통해서 파일이 저장되는 위치와 파일 이름을 어떻게 작성할지를 정의합니다.————————————————————————————————————————-const storage=multer.diskStorage({//디스크 스토리지 정의 destination:function(req, file, cb){cb(null,’uploads/’)//cb콜백 함수를 통해서 송신된 파일 저장 디렉토리 설정}, filen, file, function, formeom()*1E9);cb(null, file.fieldname+’-‘+uniqueSuffix);//cb콜백 함수를 통해서 송신된 파일 이름 설정}});const upload=multer({storage:storage});//multer객체 생성————————————————————————————————————————-2. 파일 업로드 처리———————————————싱글 function(req, res, next){console.log(req.file);//avatar이름의 싱글 파일 console.log(req.body);//일반적인 폼 데이터});//다중 파일 업로드 app.post(‘/photos/upload’, upload.array(‘photos’, 12), function(req, res, next){console.log(req.files);//—–파일 이름——————–1. 디스크 저장 위치 설정 multer 모듈을 사용하여 클라이언트에서 보낸 파일을 업로드 처리하려면 먼저 디스크 저장 위치에 대한 객체를 생성해야 합니다.multer의 리스크 스토리지()함수를 통해서 파일이 저장되는 위치와 파일 이름을 어떻게 작성할지를 정의합니다.————————————————————————————————————————-const storage=multer.diskStorage({//디스크 스토리지 정의 destination:function(req, file, cb){cb(null,’uploads/’)//cb콜백 함수를 통해서 송신된 파일 저장 디렉토리 설정}, filen, file, function, formeom()*1E9);cb(null, file.fieldname+’-‘+uniqueSuffix);//cb콜백 함수를 통해서 송신된 파일 이름 설정}});const upload=multer({storage:storage});//multer객체 생성————————————————————————————————————————-2. 파일 업로드 처리———————————————싱글 function(req, res, next){console.log(req.file);//avatar이름의 싱글 파일 console.log(req.body);//일반적인 폼 데이터});//다중 파일 업로드 app.post(‘/photos/upload’, upload.array(‘photos’, 12), function(req, res, next){console.log(req.files); //—–ファイル名————–response-time미들웨어 response-time은 클라이언트 요구에 대한 응답 시간을 관리하는 미들웨어입니다.여기에서 응답 시간은 요구가 이 미들웨어에 들어온 시간에서 헤더가 클라이언트에 기록되기까지의 경과 시간으로 정의됩니다. ··공식 문서:http://expressjs.com/en/resources/middleware/response-time.html→ → npminstallresponse-time#response-time듈설치n→ → npminstallresponse-time#response-time듈설치nconstexpress=requireexpress”;constresponseTime=requireresponseresponse-time’;constapp=express();app.use(req,res,time)={//라이언트로부const요이올걸마때간린(력console시답됨이console.log(‘${req.url}${time};’);get/’,function(resq){reslistenworld{reslisten!3000.connect-timeout미들웨어 connect-timeout은 클라이언트의 요구에 대해서 지정된 시간에 응답하지 못할 경우 타임 아웃, 즉 접속을 종료하는 기능을 제공하는 미들웨어입니다. ·공식 문서:http://expressjs.com/en/resources/middleware/timeout.html·타임 아웃시에 503 Service Unavailable오류 발생→ → npminstallconnect-module#connect-module””→ → npminstallconnect-module#connect-module””#모든 라우터에 타임 아웃 설정 constexpress=require(‘express’)const timeout=require(‘connect-timeout’);constapp=express(”app.use(timeout(‘5s’);//모든 라우터에 대해서 5초 타임 아웃 설정# 모든 라우터에 타임아웃 설정 constexpress=require(‘express’) const timeout=require(‘connect-timeout’); constapp=express(‘app.use(‘5s’));/모든 라우터에 대해 5초 타임아웃 설정#constexpress=requireexpress’웃);’;varbodyParser=requirebodybody-parser’)consttimeout=requireconnectconnect-parser’;constapp=express();app.use(’55s’);//든”/초설 save정임타//해 5초웃아 jexpress대(‘임 expresspost2halt정(app청설 varrequireconsttimeout임해(‘타/save타웃 on정//, 아, 아 son(”-로-서우요 nexton(err, id){if(err)returnnext(err)if(req.timedout)returnres.send(‘saveasid’+id)};};};함수 haltOnTimedout(req, res, next){if(!req.timedout)next(. cb){setTimeout(function)}{cb(null,(Mat.random()*40000)>>0;)};)출처도서, Node.js 프로젝트 투입 일주일전 (고승원) Express, http://expressjs.com/en/resources/middleware.html