-
node.js express 연습하기2카테고리 없음 2019. 6. 5. 02:51
8.2. Router 객체를 이용해 라우팅 함수 등록하기
/** * POST로 요청할 때 URL 파라미터를 params 객체로 확인 * * (1) 웹 브라우저에서 http://localhost:3000/public/login3.html 페이지 열고 요청 * (2) 크롬 브라우저의 Postman 앱이나 기타 POST 요청 도구를 사용하여 POST 방식으로 요청 * */ // Express 기본 모듈 불러오기 var express = require('express') , http = require('http') , path = require('path'); // Express의 미들웨어 불러오기 var bodyParser = require('body-parser') , static = require('serve-static'); // 익스프레스 객체 생성 var app = express(); // 기본 속성 설정 app.set('port', process.env.PORT || 3001); // body-parser를 이용해 application/x-www-form-urlencoded 파싱 app.use(bodyParser.urlencoded({ extended: false })) // body-parser를 이용해 application/json 파싱 app.use(bodyParser.json()) app.use('/public', static(path.join(__dirname, 'public'))); // 라우터 사용하여 라우팅 함수 등록 var router = express.Router(); router.route('/process/login/:name').post(function(req, res) { console.log('/process/login/:name 처리함.'); var paramName = req.params.name; //action뒤에 오는 것은 params라고 한다. var paramId = req.body.id || req.query.id; var paramPassword = req.body.password || req.query.password; res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); res.write('<h1>Express 서버에서 응답한 결과입니다.</h1>'); res.write('<div><p>Param name : ' + paramName + '</p></div>'); res.write('<div><p>Param id : ' + paramId + '</p></div>'); res.write('<div><p>Param password : ' + paramPassword + '</p></div>'); res.write("<br><br><a href='/public/login3.html'>로그인 페이지로 돌아가기</a>"); res.end(); }); app.use('/', router); // 등록되지 않은 패스에 대해 페이지 오류 응답 app.all('*', function(req, res) { res.status(404).send('<h1>ERROR - 페이지를 찾을 수 없습니다.</h1>'); }); // Express 서버 시작 http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); });
client에서 요청할 때 url 뒤에 ? 기호를 붙이면 요청 파라미터를 추가하여 보낼수 있다. 클라이언트에서 서버로
데이터를 전달하는 방식은 이것 이외에도 url파라미터를 사용하기도 한다. 요청 파라미터와 달리 url 주소의 일
부로 들어간다.
app.post 메소드를 호출할 때 전달하는 첫번째 파라미터의 값이 /process/login에서 /process/login/:name
으로 변경되었다. 이렇게 지정한 파라미터는 req.params 객체안에 들어간다. 따라서 :name으로 표시된 부분에
넣어 전달된 값은 req.params.name속성으로 접근할 수 있다. 이것을 토큰 이라고도 부른다.
login2.html 파일을 복사하여 login3.html 파일을 만들어 다음과 같이 요청 url을 수정한다.
<form method="post" action = "/process/login/mike">
action 속성 값으로 /process/login/mike 를 넣었으므로 mike라는 문자열이 url 파라미터로 전달된다.
url파라미터를 전달하기 위한 웹 페이지 서버에서 url파라미터를 전달받아 보여 준 결과 클라이언트가 보낸 url에 포함된 문자열 중 일부를 서버에서 파라미터로 처리할 수 있다는 것을 알게되었다.
9. express-error-handler 모듈을 이용해 에러 처리하기
// Express 기본 모듈 불러오기 var express = require('express') , http = require('http') , path = require('path'); // Express의 미들웨어 불러오기 var bodyParser = require('body-parser') , static = require('serve-static') , errorHandler = require('errorhandler'); // 에러 핸들러 모듈 사용 var expressErrorHandler = require('express-error-handler'); // 익스프레스 객체 생성 var app = express(); // 기본 속성 설정 app.set('port', process.env.PORT || 3002); // body-parser를 이용해 application/x-www-form-urlencoded 파싱 app.use(bodyParser.urlencoded({ extended: false })) // body-parser를 이용해 application/json 파싱 app.use(bodyParser.json()) app.use('/public', static(path.join(__dirname, 'public'))); // 라우터 사용하여 라우팅 함수 등록 var router = express.Router(); router.route('/process/login').post(function(req, res) { console.log('/process/login 처리함.'); var paramId = req.body.id || req.query.id; var paramPassword = req.body.password || req.query.password; res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); res.write('<h1>Express 서버에서 응답한 결과입니다.</h1>'); res.write('<div><p>Param id : ' + paramId + '</p></div>'); res.write('<div><p>Param password : ' + paramPassword + '</p></div>'); res.write("<br><br><a href='/public/login2.html'>로그인 페이지로 돌아가기</a>"); res.end(); }); app.use('/', router); // 등록되지 않은 패스에 대해 페이지 오류 응답 app.all('*', function(req, res) { res.status(404).send('<h1>ERROR - 페이지를 찾을 수 없습니다.</h1>'); }); // 404 에러 페이지 처리 var errorHandler = expressErrorHandler({ static: { //정적인 경로 '404': './public/404.html' } }); app.use( expressErrorHandler.httpError(404) ); app.use( errorHandler ); // Express 서버 시작 http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); });
예상하지 못한 오류가 발생했을 때 그 오류를 처리할 수 있는 미들웨어를 사용할 수 있다. 다음은 express-error-han
dler 미들웨어를 사용해 404.html 페이지를 응답으로 보내주는 예제이다.
express-error-handler 모듈은 특정 오류 코드에 따라 클라이언트로 응답을 보내줄 때 미리 만들어 놓은 웹 문서를
보내 줄 수 있다. 이 모듈은 외장 모듈이므로 코드의 위쪽에서 먼저 require() 메소드를 호출하여 모듈을 불러들인다.
오류 페이지는 모든 라우터 처리가 끝난 후 처리되어야 한다. 따라서 서버를 시작하기 위해 호출하는 코드 위쪽에 미
들웨어로 추가한다. 이제 [public] 폴더 안에 404.html파일을 만들고 그 안에 오류 표시를 위한 코드를 입력한다.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>에러 페이지</title> </head> <body> <h3>ERROR - 페이지를 찾을 수 없습니다.</h3> <hr/> <p>/public/404.html 파일의 에러 페이지를 표시한 것입니다.</p> </body> </html>
서버를 실행한 후 웹 브라우저에서 아무 주소나 입력하면 다음과 같이 오류 메시지가 뜬다.
10. URL 파라미터를 params 객체로 확인하기
// Express 기본 모듈 불러오기 var express = require('express') , http = require('http') , path = require('path'); // Express의 미들웨어 불러오기 var bodyParser = require('body-parser') , static = require('serve-static'); // 익스프레스 객체 생성 var app = express(); // 기본 속성 설정 app.set('port', process.env.PORT || 3003); // body-parser를 이용해 application/x-www-form-urlencoded 파싱 app.use(bodyParser.urlencoded({ extended: false })) // body-parser를 이용해 application/json 파싱 app.use(bodyParser.json()) app.use('/public', static(path.join(__dirname, 'public'))); // 라우터 사용하여 라우팅 함수 등록 var router = express.Router(); router.route('/process/users/:id').get(function(req, res) { console.log('/process/users/:id 처리함.'); // URL 파라미터 확인 var paramId = req.params.id; console.log('/process/users와 토큰 %s를 이용해 처리함.', paramId); res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); res.write('<h1>Express 서버에서 응답한 결과입니다.</h1>'); res.write('<div><p>Param id : ' + paramId + '</p></div>'); res.end(); }); app.use('/', router); // 등록되지 않은 패스에 대해 페이지 오류 응답 app.all('*', function(req, res) { res.status(404).send('<h1>ERROR - 페이지를 찾을 수 없습니다.</h1>'); }); // Express 서버 시작 http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); });
get() 메소드를 호출하면서 동시에 /process/users/:id 패스를 처리하도록 코드를 입력한다. 여기에서 콜론을 붙인
id 값이 토큰이며, 일반적인 요청 파라미터처럼 파라미터 객체의 속성으로 확인할 수 있다. 따라서 req.params.id
코드를 사용하면 id 속성에 접근할 수 있다.
토큰을 포함하여 GET 요청을 했을 때 보여주는 응답 페이지
11. cookie parser 미들웨어 사용하기
/** * * 웹브라우저에서 아래 주소로 요청 * http://localhost:3000/process/showCookie * http://localhost:3000/process/setUserCookie * */ // Express 기본 모듈 불러오기 var express = require('express') , http = require('http') , path = require('path'); // Express의 미들웨어 불러오기 var bodyParser = require('body-parser') , cookieParser = require('cookie-parser') , static = require('serve-static') , errorHandler = require('errorhandler'); // 에러 핸들러 모듈 사용 var expressErrorHandler = require('express-error-handler'); // 익스프레스 객체 생성 var app = express(); // 기본 속성 설정 app.set('port', process.env.PORT || 14); // body-parser를 이용해 application/x-www-form-urlencoded 파싱 app.use(bodyParser.urlencoded({ extended: false })) // body-parser를 이용해 application/json 파싱 app.use(bodyParser.json()) app.use('/public', static(path.join(__dirname, 'public'))); // cookie-parser 설정 app.use(cookieParser()); // 라우터 사용하여 라우팅 함수 등록 var router = express.Router(); router.route('/process/showCookie').get(function(req, res) { console.log('/process/showCookie 호출됨.'); res.send(req.cookies); //저장된 쿠키 보는 것 }); router.route('/process/setUserCookie').get(function(req, res) { console.log('/process/setUserCookie 호출됨.'); // 쿠키 설정 //쿠키 - 웹브라우저 안에 저장 / 세션 - 서버안에 저장 res.cookie('user', { //쿠키를 통해 user라는 객체에다가 밑 내용을 저장 id: 'mike', name: '소녀시대', authorized: true }); // redirect로 응답 res.redirect('/process/showCookie'); }); app.use('/', router); // 404 에러 페이지 처리 var errorHandler = expressErrorHandler({ static: { '404': './public/404.html' } }); app.use( expressErrorHandler.httpError(404) ); app.use( errorHandler ); // Express 서버 시작 http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); });
사용자가 로그인한 상태인지 아닌지 확인하고 싶을 때에는 쿠키나 세션을 사용한다.
쿠키는 클라이언트 웹 브라우저에 저장되는 정보이며, 세션은 웹 서버에 저장되는 정보이다.
여기에서는 이 쿠키와 세션을 어떻게 다룰 수 있는지 알아보자.
쿠키는 클라이언트 웹 브라우저에 저장되는 저장로서 일정 기간 동안 저장하고 싶을 떄 사용한다.
익스프레스에서는 cookie-parser 미들웨어를 사용하면 쿠키를 설정하거나 확인할 수 있다.
showCookie setUserCookie /process/setUserCookie 패스를 처리하는 함수에서는 응답 객체의 cookie() 메소드로 user 쿠키를 추가한다.
그러면 쿠키가 클라이언트 웹 브라우저에 설정되는데 마지막 코드 부분에서 redirect() 메소드로 /process/sho
Cookie 패스를 다시 요청한다. 그러므로 그 정보는 그대로 다시 클라이언트의 웹 브라우저에 표시된다.
12. session 사용하기
/** * * 웹브라우저에서 아래 주소의 페이지를 열고 웹페이지에서 요청 * http://localhost:3000/public/login2.html * */ // Express 기본 모듈 불러오기 var express = require('express') , http = require('http') , path = require('path'); // Express의 미들웨어 불러오기 var bodyParser = require('body-parser') , cookieParser = require('cookie-parser') , static = require('serve-static') , errorHandler = require('errorhandler'); // 에러 핸들러 모듈 사용 var expressErrorHandler = require('express-error-handler'); // Session 미들웨어 불러오기 var expressSession = require('express-session'); // 익스프레스 객체 생성 var app = express(); // 기본 속성 설정 app.set('port', process.env.PORT || 17); // body-parser를 이용해 application/x-www-form-urlencoded 파싱 app.use(bodyParser.urlencoded({ extended: false })) // body-parser를 이용해 application/json 파싱 app.use(bodyParser.json()) app.use('/public', static(path.join(__dirname, 'public'))); // cookie-parser 설정 app.use(cookieParser()); // 세션 설정 app.use(expressSession({ secret:'my key', resave:true, saveUninitialized:true })); // 라우터 사용하여 라우팅 함수 등록 var router = express.Router(); // 로그인 라우팅 함수 - 로그인 후 세션 저장함 router.route('/process/login').post(function(req, res) { console.log('/process/login 호출됨.'); var paramId = req.body.id || req.query.id; var paramPassword = req.body.password || req.query.password; if (req.session.user) { // 이미 로그인된 상태 console.log('이미 로그인되어 상품 페이지로 이동합니다.'); res.redirect('/public/product.html'); } else { // 세션 저장 req.session.user = { id: paramId, name: '소녀시대', authorized: true }; res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); res.write('<h1>로그인 성공</h1>'); res.write('<div><p>Param id : ' + paramId + '</p></div>'); res.write('<div><p>Param password : ' + paramPassword + '</p></div>'); res.write("<br><br><a href='/process/product'>상품 페이지로 이동하기</a>"); res.end(); } }); // 로그아웃 라우팅 함수 - 로그아웃 후 세션 삭제함 router.route('/process/logout').get(function(req, res) { console.log('/process/logout 호출됨.'); if (req.session.user) { // 로그인된 상태 console.log('로그아웃합니다.'); req.session.destroy(function(err) { if (err) {throw err;} console.log('세션을 삭제하고 로그아웃되었습니다.'); res.redirect('/public/login2.html'); }); } else { // 로그인 안된 상태 console.log('아직 로그인되어있지 않습니다.'); res.redirect('/public/login2.html'); } }); // 상품정보 라우팅 함수 router.route('/process/product').get(function(req, res) { console.log('/process/product 호출됨.'); if (req.session.user) { res.redirect('/public/product.html'); //세션있으면 이페이지로 연결 } else { res.redirect('/public/login2.html'); } }); app.use('/', router); // 404 에러 페이지 처리 var errorHandler = expressErrorHandler({ static: { '404': './public/404.html' } }); app.use( expressErrorHandler.httpError(404) ); app.use( errorHandler ); // Express 서버 시작 http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); });
세션도 상태 정보를 저장하는 역할을 하지만, 쿠키와 달리 서버 쪽에 저장된다.
세션을 사용하는 대표적인 예로는 로그인을 했을 때 저장되는 세션을 들 수 있다. 사용자가 로그인하면 세션이 만
들어지고 로그아웃하면 세션이 삭제되는 기능을 만들면 사용자가 로그인하기 전에는 접근이 제한된 페이지를 보
지 못하도록 설정할 수 있다. 즉, 사용자가 상품 페이지처럼 접근이 제한된 페이지를 조회했을 때 로그인된 상태가
아니라면 로그인 페이지를 자동으로 열어 준다. 그러면 로그인을 해야 상품 페이지로 이동할 수 있으며 상품 페이
지에서 로그아웃 할 수 있다.
express-session 모듈은 미들웨어로 사용되기 때문에 use() 메소드를 사용해서 미들웨어에 추가한다. use() 메소
드에는 세션 객체를 호출하여 반환되는 객체를 전달한다.
로그인을 했을 때만 상품정보 페이지로 넘어갈 수 있음
13. 파일 업로드하기
/** * * * * 파일업로드를 위해 클라이언트에서 지정한 이름은 photo 입니다. * */ // Express 기본 모듈 불러오기 var express = require('express') , http = require('http') , path = require('path'); // Express의 미들웨어 불러오기 var bodyParser = require('body-parser') , cookieParser = require('cookie-parser') , static = require('serve-static') , errorHandler = require('errorhandler'); // 에러 핸들러 모듈 사용 var expressErrorHandler = require('express-error-handler'); // Session 미들웨어 불러오기 var expressSession = require('express-session'); // 파일 업로드용 미들웨어 var multer = require('multer'); var fs = require('fs'); //클라이언트에서 ajax로 요청 시 CORS(다중 서버 접속) 지원 var cors = require('cors'); // 익스프레스 객체 생성 var app = express(); // 기본 속성 설정 app.set('port', process.env.PORT || 3005); // body-parser를 이용해 application/x-www-form-urlencoded 파싱 app.use(bodyParser.urlencoded({ extended: false })) // body-parser를 이용해 application/json 파싱 app.use(bodyParser.json()) // public 폴더와 uploads 폴더 오픈 app.use('/public', static(path.join(__dirname, 'public'))); app.use('/uploads', static(path.join(__dirname, 'uploads'))); // cookie-parser 설정 app.use(cookieParser()); // 세션 설정 app.use(expressSession({ secret:'my key', resave:true, saveUninitialized:true })); //클라이언트에서 ajax로 요청 시 CORS(다중 서버 접속) 지원 app.use(cors()); //multer 미들웨어 사용 : 미들웨어 사용 순서 중요 body-parser -> multer -> router // 파일 제한 : 10개, 1G var storage = multer.diskStorage({ destination: function (req, file, callback) { callback(null, 'uploads') }, filename: function (req, file, callback) { callback(null, file.originalname + Date.now()) } }); var upload = multer({ //multer안에 storage정보 storage: storage, limits: { files: 10, fileSize: 1024 * 1024 * 1024 //1기가 } }); // 라우터 사용하여 라우팅 함수 등록 var router = express.Router(); // 파일 업로드 라우팅 함수 - 로그인 후 세션 저장함 router.route('/process/photo').post(upload.array('photo', 1), function(req, res) { console.log('/process/photo 호출됨.'); try { var files = req.files; console.dir('#===== 업로드된 첫번째 파일 정보 =====#') console.dir(req.files[0]); console.dir('#=====#') // 현재의 파일 정보를 저장할 변수 선언 var originalname = '', filename = '', mimetype = '', size = 0; if (Array.isArray(files)) { // 배열에 들어가 있는 경우 (설정에서 1개의 파일도 배열에 넣게 했음) console.log("배열에 들어있는 파일 갯수 : %d", files.length); for (var index = 0; index < files.length; index++) { originalname = files[index].originalname; filename = files[index].filename; mimetype = files[index].mimetype; size = files[index].size; } } else { // 배열에 들어가 있지 않은 경우 (현재 설정에서는 해당 없음) console.log("파일 갯수 : 1 "); originalname = files[index].originalname; filename = files[index].name; mimetype = files[index].mimetype; size = files[index].size; } console.log('현재 파일 정보 : ' + originalname + ', ' + filename + ', ' + mimetype + ', ' + size); // 클라이언트에 응답 전송 res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); res.write('<h3>파일 업로드 성공</h3>'); res.write('<hr/>'); res.write('<p>원본 파일명 : ' + originalname + ' -> 저장 파일명 : ' + filename + '</p>'); res.write('<p>MIME TYPE : ' + mimetype + '</p>'); res.write('<p>파일 크기 : ' + size + '</p>'); res.end(); } catch(err) { console.dir(err.stack); } }); app.use('/', router); // 404 에러 페이지 처리 var errorHandler = expressErrorHandler({ static: { '404': './public/404.html' } }); app.use( expressErrorHandler.httpError(404) ); app.use( errorHandler ); // Express 서버 시작 http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); });
express는 사용자가 업로드한 파일을 받아서 저장하는 기본 기능을 제공하지 않는다. 따라서 모듈을 설치해서
(ex. multer) 사용자가 전송한 파일을 처리하는 작업을 해야한다. 사용자가 post 방식으로 전송한 데이터가 up
load 라는 디렉토리를 향하고 있다면 그 다음 함수를 실행하여 콘트롤러로 연결한다. 미들웨어 upload.array('p
hoto', 1 )는 뒤의 function(req, res)함수가 실행되기 전에 먼저 실행되어야 한다. upload.array('photo', 1)의
매개변수 'photo'는 form을 통해 전송되는 파일의 name속성을 가져야 한다.
업로드 화면 구현을 위한 코드는 다음과 같다.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>파일업로드 테스트</title> </head> <body> <h1>파일업로드</h1> <br> <form method="post" enctype="multipart/form-data" action="/process/photo"> <table> <tr> <td><label>파일</label></td> <td><input type="file" name="photo" /></td> </tr> </table> <input type="submit" value="업로드" name="submit"/> </form> </body> </html>
코드 실행 결과
14. 파일 다운로드하기
/** * * 웹브라우저에서 아래 주소의 페이지를 열고 웹페이지에서 요청 * http://localhost:3000/process/download?filepath=/downloads/house.png * * 파일다운로드를 위해 클라이언트에서 지정한 이름은 /downloads/house.png 입니다. */ // Express 기본 모듈 불러오기 var express = require('express') , http = require('http') , path = require('path'); // Express의 미들웨어 불러오기 var bodyParser = require('body-parser') , cookieParser = require('cookie-parser') , static = require('serve-static') , errorHandler = require('errorhandler'); // 에러 핸들러 모듈 사용 var expressErrorHandler = require('express-error-handler'); // Session 미들웨어 불러오기 var expressSession = require('express-session'); // 파일 업로드용 미들웨어 var multer = require('multer'); var fs = require('fs'); //클라이언트에서 ajax로 요청 시 CORS(다중 서버 접속) 지원 var cors = require('cors'); //**중요 // mime 모듈 var mime = require('mime-types'); // 익스프레스 객체 생성 var app = express(); // 기본 속성 설정 app.set('port', process.env.PORT || 3016); // body-parser를 이용해 application/x-www-form-urlencoded 파싱 app.use(bodyParser.urlencoded({ extended: false })) // body-parser를 이용해 application/json 파싱 app.use(bodyParser.json()) // public 폴더와 uploads 폴더 오픈 app.use('/public', static(path.join(__dirname, 'public'))); app.use('/uploads', static(path.join(__dirname, 'uploads'))); // cookie-parser 설정 app.use(cookieParser()); // 세션 설정 app.use(expressSession({ secret:'my key', resave:true, saveUninitialized:true })); //클라이언트에서 ajax로 요청 시 CORS(다중 서버 접속) 지원 app.use(cors()); //multer 미들웨어 사용 : 미들웨어 사용 순서 중요 body-parser -> multer -> router // 파일 제한 : 10개, 1G var storage = multer.diskStorage({ destination: function (req, file, callback) { callback(null, 'uploads') }, filename: function (req, file, callback) { callback(null, file.originalname + Date.now()) } }); var upload = multer({ storage: storage, limits: { files: 10, fileSize: 1024 * 1024 * 1024 } }); // 라우터 사용하여 라우팅 함수 등록 var router = express.Router(); //파일 다운로드 패스에 대한 라우팅 router.route('/process/download').get(function(req, res) { console.log('/process/download 호출됨.'); try { var paramFilepath = req.param('filepath'); var filepath = __dirname + paramFilepath; var filename = path.basename(paramFilepath); var mimetype = mime.lookup(paramFilepath); console.log('파일 패스 : ' + filepath); console.log('파일 이름 : ' + filename); console.log('MIME 타입 : ' + mimetype); // 파일 크기 확인 var stats = fs.statSync(filepath); var fileSize = stats["size"]; console.log('파일 크기 : ' + fileSize); // 클라이언트에 응답 전송 res.setHeader('Content-disposition', 'attachment; filename=' + filename); res.setHeader('Content-type', mimetype); res.setHeader('Content-Length', fileSize); var filestream = fs.createReadStream(filepath); filestream.pipe(res); } catch(err) { console.dir(err.stack); res.writeHead('400', {'Content-Type':'text/html;charset=utf8'}); res.write('<h3>파일 다운로드 실패</h3>'); res.end(); } }); // 파일 업로드 라우팅 함수 - 로그인 후 세션 저장함 router.route('/process/photo').post(upload.array('photo', 1), function(req, res) { console.log('/process/photo 호출됨.'); try { var files = req.files; console.dir('#===== 업로드된 첫번째 파일 정보 =====#') console.dir(req.files[0]); console.dir('#=====#') // 현재의 파일 정보를 저장할 변수 선언 var originalname = '', filename = '', mimetype = '', size = 0; if (Array.isArray(files)) { // 배열에 들어가 있는 경우 (설정에서 1개의 파일도 배열에 넣게 했음) console.log("배열에 들어있는 파일 갯수 : %d", files.length); for (var index = 0; index < files.length; index++) { originalname = files[index].originalname; filename = files[index].filename; mimetype = files[index].mimetype; size = files[index].size; } } else { // 배열에 들어가 있지 않은 경우 (현재 설정에서는 해당 없음) console.log("파일 갯수 : 1 "); originalname = files[index].originalname; filename = files[index].name; mimetype = files[index].mimetype; size = files[index].size; } console.log('현재 파일 정보 : ' + originalname + ', ' + filename + ', ' + mimetype + ', ' + size); // 클라이언트에 응답 전송 res.writeHead('200', {'Content-Type':'text/html;charset=utf8'}); res.write('<h3>파일 업로드 성공</h3>'); res.write('<hr/>'); res.write('<p>원본 파일명 : ' + originalname + ' -> 저장 파일명 : ' + filename + '</p>'); res.write('<p>MIME TYPE : ' + mimetype + '</p>'); res.write('<p>파일 크기 : ' + size + '</p>'); res.end(); } catch(err) { console.dir(err.stack); } }); app.use('/', router); // 404 에러 페이지 처리 var errorHandler = expressErrorHandler({ static: { '404': './public/404.html' } }); app.use( expressErrorHandler.httpError(404) ); app.use( errorHandler ); // Express 서버 시작 var server = http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on %s, %s', server.address().address, server.address().port); });
파일 업로드와 같이 multer 미들웨어를 사용한다. 서버로 요청할 api를 만들어 받은 요청에 대해
multer 미들웨어를 이용하여 이미지를 저장하고 저장된 경로를 반환해주도록 한다.
라우터에 post 방식으로 upload 요청이 들어왔을 경우 upload.array()를 통해 파일을 받아 저장
하게 된다.
코드를 실행했을 때 다음과 같이 이미지 파일이 다운로드 됨