SlideShare a Scribd company logo
Node.js 심화과정
신촌 크레바스 스터디 - 3주차 첫번째
로그인/회원가입, 이미지 업로드, 몽고DB
홍석유
syhong0714@gmail.com
3주차 첫번째 스터디 ­ Node.js
express
실제 서비스 구축
Express generator를 활용해
초기 파일구조를 확립
express	-e	ejs -c	less	moca_server
3주차 첫번째 스터디 ­ Node.js
라우팅Routes라는 디렉토리를 만들고 API를 구조화
var routes	=	require('./routes/index');
var users	=	require('./routes/users');
var users2	=	require('./routes/users2');
var books	=	require('./routes/books');
var proposals	=	require('./routes/proposals');
var ejsbooks =	require('./routes/ejsbooks');
app.use('/',	routes);
app.use('/users',	users2);
app.use('/api/1/users',	users);
app.use('/api/1/books',	 books);
app.use('/api/1/proposals',	 proposals);
->
3주차 첫번째 스터디 ­ Node.js
API 리소스해당 리소스에 대한 작업은 해당 리소스에서
app.use('/',	routes);
app.use('/users',	users2);
app.use('/api/1/users',	users);
app.use('/api/1/books',	 books);
app.use('/api/1/proposals',	 proposals);
GET, POST, PUT, DELETE
3주차 첫번째 스터디 ­ Node.js
./routes/users.jsusers 리소스 api
최상단
var express	=	require('express');
var router	=	express.Router();
var mysql =	require('mysql');
var client	=	mysql.createConnection({
host:	'localhost',
user:	'root',
database:	'test'
});
3주차 첫번째 스터디 ­ Node.js
모델/작가
리스트 조회
users 리소스 api
/*	모델/작가 리스트 조회(select)	- user_type:	M(모델),	P(작가)	+++	나중에 시
간되면 쿼리스트링 더 넣어서 필터도 만들기!!!	*/
//	moca.com/api/1/users?user_type=M
router.get('/',	function(req,	res,	next)	{
var user_type =	req.query.user_type;
if	(user_type ==	'P'	||	'M'	)	{
client.query('SELECT	*	FROM	user	WHERE	user_type =	?',	user_type,	function	
(err,	rows,	fields)	{
if(err)	{
console.log(err);
}
varusers	=	[];
rows.forEach(function(row)	{
users.push({
id								 :	row.id,
username		:	row.username,
address			 :	row.address,
price					 :	row.price,
user_type :	row.user_type
});
});
res.json({users:	 users});
});
}
});
router/get(‘/’, callback)
3주차 첫번째 스터디 ­ Node.js
Users 생성
(회원가입)
router/post(‘/’, callback)
/*	users	생성(회원가입,	insert)	*/
//	moca.com/api/1/users
router.post('/',	 function(req,	res,	next)	{
var data	=	{
'username':	req.body.username,
'address'	:	req.body.address,
'price'			:	req.body.price
}
client.query('INSERT	*	into	user	SET	?',	data,	function(err,	
rows,	fields)	{
if	(err)	{
conosole.log(err);
}
res.status(200);
});
});
3주차 첫번째 스터디 ­ Node.js
Users
(회원정보수정)
router/put(‘/:user_id’, callback)
/*	모델/작가 등록하기 &	정보수정하기 - 가입하기와 다름.	
이들은 가입을 했기 때문에 user_id를 발급받았음 */
//	moca.com/api/1/users/2?user_type=M
router.put('/:user_id',	 function(req,	res,	next)	{
var user_id =	req.params.user_id;
var user_type =	req.query.user_type;
client.query('UPDATE	user	SET	user_type =	?	WHERE	id	=	?',	
[user_type,	user_id],	function(err,	rows,	fields)	{
if	(err)	{
console.log(err);
}
});
});
3주차 첫번째 스터디 ­ Node.js
Users
(전체유저 조회)
Router/get(‘/’, callback)
/*	전체 유저 조회 - 나중에 admin	만들 때 활용 */
//	moca.com/api/1/users
router.get('/',	function(req,	res,	next)	{
var user_type =	req.query.user_type;
client.query('SELECT	*	FROM	user	WHERE	user_type =	?',	
user_type,	function	(err,	rows,	fields)	{
if(err)	{
console.log(err);
}
varusers	=	[];
rows.forEach(function(row)	{
users.push({
id								:	row.id,
username		:	row.username,
address			:	row.address,
price					:	row.price,
user_type :	row.user_type
});
});
res.json({users:	users});
});
});
3주차 첫번째 스터디 ­ Node.js
books
(전체사진첩 조회)
Router/get(‘/’, callback)
/*	books	전체에 대한 조회(select)	*/
router.get('/',	function(req,	res,	next)	{
client.query('SELECT	b.id AS	books_id,	 b.username AS	
books_username,	 i.img_url AS	img_url_img_url FROM	books	b	
JOIN	img_url i ON	b.img_url1	=	i.id',	function	(err,	rows,	fields)	{
if(err)	{
console.log(err);
}
varbooks	=	[];
rows.forEach(function(row)	{
books.push({
id							:	row.books_id,
username	:	row.books_username,
img_url :	row.img_url_img_url
});
});
res.json({books:	books});
});
});
3주차 두번째 스터디 ­ Node.js
쿠키와 세션
데이터를 어디에 저장할 것인가?
보안, 데이터의 양, …
connect.sid ­ 사용자의 식별자
(아이디와 비밀번호를 브라우저에 저장하지 않는다)
3주차 첫번째 스터디 ­ Node.js
로그인 view(get)
app.get('/auth/login',	 function(req,	res)	{
var output	=	`
<h1>Login</h1>
<form	action='/auth/login'	method='post'>
<p><input	type='text'	name='username'	placeholder='useranme’></p>
<p><input	type='password'	name='password'	placeholder='password’></p>
<p><input	type="submit”></p>
</form>
`;
res.send(output);
});
template strings
3주차 첫번째 스터디 ­ Node.js
로그인 로직(post)
app.post('/auth/login',	 function(req,	res)	{
var user	=	{
username:	'kevin',
password:	'1234',
displayName:	'kevin hong'
};
var uname =	req.body.username;
var pwd =	req.body.password;
if(uname ===	user.username &&	pwd ===	user.password)	{
res.redirect('/welcome');
}	else	{
res.send('Who	are	you?	<a	href="/auth/login">login</a>');
}
});
var express	=	require('express');
var session	=	require('express-session');
var bodyParser =	require('body-parser');
3주차 첫번째 스터디 ­ Node.js
세션
var express	=	require('express');
var session	=	require('express-session');
var bodyParser =	require('body-parser');
var MySQLStore =	require('express-mysql-session')(session);
app.use(session({
secret:	'djfivjdFDjfh1@1@$ei%#213#',
resave:	false,
saveUninitialized:	true,
store:	new	MySQLStore({
host:	'localhost',
port:	3306,
database:	'test'
})
}));
3주차 첫번째 스터디 ­ Node.js
로그인 + 세션
app.post('/auth/login',	 function(req,	res)	{
var user	=	{
username:	'kevin',
password:	'1234',
displayName:	'kevin hong'
};
var uname =	req.body.username;
var pwd =	req.body.password;
if(uname ===	user.username &&	pwd ===	user.password)	{
req.session.displayName =	user.displayName;
req.session.save(function()	{
res.redirect('/welcome');
});
}	else	{
res.send('Who	are	you?	<a	href="/auth/login">login</a>');
}
});
app.get('/welcome',	function(req,	res)	{
if	(req.session.displayName)	{
res.send(`
<h1>Hello,	${req.session.displayName}<h1>
<a	href="/auth/logout">logout</a>
`);
}	else	{
res.send(`
<h1>Welcome</h1>
<a	href="/auth/login">Login</a>
`);
}
});
3주차 첫번째 스터디 ­ Node.js
DB에 세션 저장하기
3주차 첫번째 스터디 ­ Node.js
md5
SHA256
pbkdf2-password npm
salt
if(uname ===	user.username &&	pwd ===	user.password)
3주차 첫번째 스터디 ­ Node.js
passport js
redis
Strategy: local, facebook
3주차 첫번째 스터디 ­ Node.js
Ejs로 json api 파싱하기
쿠키
Node.js 심화과정
신촌 크레바스 스터디 - 3주차 두번째
로그인/회원가입
홍석유
syhong0714@gmail.com
3주차 두번째 스터디 ­ Node.js
pbkdf2-password npm
var bkfd2Password	=	require("pbkdf2-password");
var hasher	=	bkfd2Password();
crypto
hasher({password:pwd,	 salt:user.salt},	function(err,	pass,	salt,	hash)	{
if(hash	===	user.password)	{
done(null,	user);
}	else	{
done(null,	false);
}
});
3주차 두번째 스터디 ­ Node.js
pbkdf2-password npm crypto
3주차 두번째 스터디 ­ Node.js
passport.js
Strategy
Local Strategy Facebook Str
Google Str
Twitter Str
Kakao, Naver, …
Passport - local
var passport	=	require('passport');
var LocalStrategy =	require('passport-local').Strategy;
app.post(
'/auth/login',
passport.authenticate(
'local',
{
successRedirect:	'/welcome',
failureRedirect:	'/auth/login',
failureFlash:	false
}
)
);
passport.use(new	LocalStrategy(
function(username,	password,	done)	 {
varuname =	username;
varpwd =	password;
for	(var i =	0;	i <	users.length;	i++)	{
varuser	=	users[i];
if(uname ===	user.username)	{
return	hasher({password:pwd,	 salt:user.salt},	function(err,	
pass,	salt,	hash)	{
if(hash	===	user.password)	{
done(null,	user);
}	else	{
done(null,	false);
}
});
}
}
done(null,	false);
}
));
3주차 두번째 스터디 ­ Node.js
Passport - FB
var passport	=	require('passport');
var FacebookStrategy =	require('passport-
facebook').Strategy;
app.get(
'/auth/facebook',
passport.authenticate(
'facebook'
)
);
app.get(
'/auth/facebook/callback',
passport.authenticate(
'facebook',
{
successRedirect:	'/welcome',
failureRedirect:	'/auth/login'
}
)
);
passport.use(new	FacebookStrategy({
clientID:	'2925359214154649',
clientSecret:	'0966dbedda54bbafe984f7e12bcd0c40',
callbackURL:	"/auth/facebook/callback"
},
function(accessToken,	refreshToken,	 profile,	done)	{
varauthID =	'facebook:'+profile.id;
for	(var i =	0;	i <	users.length;	i++)	{
varuser	=	users[i];
if	(user.authId ===	authId)	{
return	done(null,	 user);
}
}
varnewuser =	{
'authId'						:	authId,
'displayName'	:	profile.displayName
};
users.push(newuser);
done(null,	newuser);
}
));
3주차 두번째 스터디 ­ Node.js
Passport - FB
3주차 두번째 스터디 ­ Node.js
Passport - session
passport.serializeUser(function(user,	done)	{
done(null,	 user.id);
});
passport.deserializeUser(function(id,	done)	{
for	(var i =	0;	i <	users.length;	i++)	{
varuser	=	users[i];
if(user.id ===	id)	{
done(null,	user);
}
}
});
app.use(passport.initialize());
app.use(passport.session());
3주차 두번째 스터디 ­ Node.js
Passport - session
passport.serializeUser(function(user,	done)	{
done(null,	 user.id);
});
passport.deserializeUser(function(id,	done)	{
for	(var i =	0;	i <	users.length;	i++)	{
varuser	=	users[i];
if(user.id ===	id)	{
done(null,	user);
}
}
});
app.use(passport.initialize());
app.use(passport.session());
3주차 두번째 스터디 ­ Node.js
Passport - 구현예제
app.get('/auth/login',	 function(req,	res)	{
var output	=	`
<h1>Login</h1>
<form	action='/auth/login'	method='post'>
<p><input	type='text'	name='username'	
placeholder='useranme'></p>
<p><input	type='password'	name='password'	
placeholder='password'></p>
<p><input	type="submit"></p>
</form>
<a	href="/auth/facebook">facebook</a>
`;
res.send(output);
});
3주차 두번째 스터디 ­ Node.js
Ejs로 json api 파싱하기
쿠키
redis
3주차 두번째 스터디 ­ Node.js
Node.js 심화과정
신촌 크레바스 스터디 - 3주차 세번째
이미지 업로드
홍석유
syhong0714@gmail.com
3주차 세번째 스터디 ­ Node.js
이미지업로드 모듈
aws-sdk
formidable
multer
multer-s3
mysql 멀티이미지업로드
이미지업로드 & DB저장
3주차 세번째 스터디 ­ Node.js
싱글이미지 upload
var AWS	=	require('aws-sdk');
AWS.config.region =	'ap-northeast-1';
var s3	=		new	AWS.S3();
var formidable	=	require('formidable');
var fs	=	require('fs');
var client	=	mysql.createConnection({
host:	'localhost',
user:	'root',
database:	'test'
});
<html>
<body>
<form	action="/api/1/books"	method="post"	 enctype="multipart/form-
data">
<input	type="file"	name="userfile">
<input	type="submit">
</form>
</body>
</html>
3주차 세번째 스터디 ­ Node.js
싱글이미지 upload
alt + tab
3주차 세번째 스터디 ­ Node.js
멀티이미지 upload
var express	=	require('express');
var bodyParser =	require('body-parser');
var multer =	require('multer');
var multerS3	=	require('multer-s3');
var AWS	=	require('aws-sdk');
AWS.config.region =	'ap-northeast-1';
var app	=	express();
var s3	=	new	AWS.S3();
app.use(bodyParser.json());
<!DOCTYPE	html>
<html	lang="en">
<head>
<meta	charset="UTF-8">
<title></title>
</head>
<body>
<form	action="/api/1/multers3"	method="post"	
enctype="multipart/form-data">
<input	type="file"	name="userPhoto"	 multiple	/>
<input	type="submit">
</form>
</body>
</html>
3주차 세번째 스터디 ­ Node.js
멀티이미지 upload
app.get('/multers3',	 function(req,	res)	{
res.sendFile(__dirname +	'/public/uploadform.html');
});
app.post('/api/1/multers3',	 upload.array('userPhoto',	 10),	
function(req,	res,	next)	{
res.send('uploaded!');
});
var upload	=	multer({
storage:	multerS3({
s3					:	s3,
bucket	:	'mocatest',
acl :	'public-read',
key				:	function(req,	file,	callback)	{
callback(null,	file.originalname);
}
})
});

More Related Content

PDF
Node.js 기본과정
PDF
Node.js intro
PDF
막하는 스터디 첫 번째 만남 Node.js
PPTX
Node.js
PPTX
Nodejs, PhantomJS, casperJs, YSlow, expressjs
PDF
진짜기초 Node.js
PPTX
Leadweb Nodejs
PPTX
Nodejs 발표자료
Node.js 기본과정
Node.js intro
막하는 스터디 첫 번째 만남 Node.js
Node.js
Nodejs, PhantomJS, casperJs, YSlow, expressjs
진짜기초 Node.js
Leadweb Nodejs
Nodejs 발표자료

What's hot (20)

PPTX
Startup JavaScript 7 - Node.JS 기초
PDF
Express 프레임워크
PDF
Html5 web workers
PPTX
Node js[stg]onimusha 20140822
PDF
막하는스터디 두번째만남 Express(20151025)
PDF
파크히어 Realm 사용 사례
PPTX
5-4. html5 offline and storage
PPTX
5-5. html5 connectivity
PPTX
Node.js를 사용한 Big Data 사례연구
PDF
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
PDF
Node.js 기본
PDF
세션3 node.js의 의미와 자바의 대안
PPTX
Startup JavaScript 9 - Socket.IO 실시간 통신
PPTX
4-3. jquery
PPTX
아꿈사 발표 Node JS 프로그래밍 8장
PPTX
Node.js의 도입과 활용
PDF
Node.js 자바스크립트로 서버사이드 개발하기
PDF
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
PDF
Javascript everywhere - Node.js | Devon 2012
PDF
Node.js at OKJSP
Startup JavaScript 7 - Node.JS 기초
Express 프레임워크
Html5 web workers
Node js[stg]onimusha 20140822
막하는스터디 두번째만남 Express(20151025)
파크히어 Realm 사용 사례
5-4. html5 offline and storage
5-5. html5 connectivity
Node.js를 사용한 Big Data 사례연구
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
Node.js 기본
세션3 node.js의 의미와 자바의 대안
Startup JavaScript 9 - Socket.IO 실시간 통신
4-3. jquery
아꿈사 발표 Node JS 프로그래밍 8장
Node.js의 도입과 활용
Node.js 자바스크립트로 서버사이드 개발하기
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
Javascript everywhere - Node.js | Devon 2012
Node.js at OKJSP
Ad

Viewers also liked (8)

PDF
일주일만에 끝내는 MySQL
PDF
모카 기술발표자료
PDF
개발자가 도전하는 MariaDB 서버구축
PDF
Amazon Aurora 100% 활용하기
PPTX
Redis
PDF
웹을 지탱하는 기술
PDF
Redis acc
PPTX
개발자도 알아야 하는 DBMS튜닝
일주일만에 끝내는 MySQL
모카 기술발표자료
개발자가 도전하는 MariaDB 서버구축
Amazon Aurora 100% 활용하기
Redis
웹을 지탱하는 기술
Redis acc
개발자도 알아야 하는 DBMS튜닝
Ad

Similar to Node.js 심화과정 (20)

PPTX
Nodejs express
PPTX
One-day-codelab
PPTX
Startup JavaScript 8 - NPM, Express.JS
PDF
Mean 스택을 사용한 IoT 개발
PPTX
Node.js and react
PDF
Front-end Development Process - 어디까지 개선할 수 있나
PDF
챗봇 시작해보기
PDF
overview of spring4
PDF
Resource Handling in Spring MVC
KEY
vine webdev
PDF
Javascript 조금 더 잘 알기
PDF
테스트
PPTX
처음 접하는 Oozie Workflow, Coordinator
PDF
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
PPTX
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API
PPTX
Nest js 101
PDF
Express framework tutorial
KEY
Html5 performance
PPTX
Xe hack
PDF
자바스크립트 프레임워크 살펴보기
Nodejs express
One-day-codelab
Startup JavaScript 8 - NPM, Express.JS
Mean 스택을 사용한 IoT 개발
Node.js and react
Front-end Development Process - 어디까지 개선할 수 있나
챗봇 시작해보기
overview of spring4
Resource Handling in Spring MVC
vine webdev
Javascript 조금 더 잘 알기
테스트
처음 접하는 Oozie Workflow, Coordinator
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API
Nest js 101
Express framework tutorial
Html5 performance
Xe hack
자바스크립트 프레임워크 살펴보기

Node.js 심화과정

  • 1. Node.js 심화과정 신촌 크레바스 스터디 - 3주차 첫번째 로그인/회원가입, 이미지 업로드, 몽고DB 홍석유 syhong0714@gmail.com
  • 2. 3주차 첫번째 스터디 ­ Node.js express 실제 서비스 구축 Express generator를 활용해 초기 파일구조를 확립 express -e ejs -c less moca_server
  • 3. 3주차 첫번째 스터디 ­ Node.js 라우팅Routes라는 디렉토리를 만들고 API를 구조화 var routes = require('./routes/index'); var users = require('./routes/users'); var users2 = require('./routes/users2'); var books = require('./routes/books'); var proposals = require('./routes/proposals'); var ejsbooks = require('./routes/ejsbooks'); app.use('/', routes); app.use('/users', users2); app.use('/api/1/users', users); app.use('/api/1/books', books); app.use('/api/1/proposals', proposals); ->
  • 4. 3주차 첫번째 스터디 ­ Node.js API 리소스해당 리소스에 대한 작업은 해당 리소스에서 app.use('/', routes); app.use('/users', users2); app.use('/api/1/users', users); app.use('/api/1/books', books); app.use('/api/1/proposals', proposals); GET, POST, PUT, DELETE
  • 5. 3주차 첫번째 스터디 ­ Node.js ./routes/users.jsusers 리소스 api 최상단 var express = require('express'); var router = express.Router(); var mysql = require('mysql'); var client = mysql.createConnection({ host: 'localhost', user: 'root', database: 'test' });
  • 6. 3주차 첫번째 스터디 ­ Node.js 모델/작가 리스트 조회 users 리소스 api /* 모델/작가 리스트 조회(select) - user_type: M(모델), P(작가) +++ 나중에 시 간되면 쿼리스트링 더 넣어서 필터도 만들기!!! */ // moca.com/api/1/users?user_type=M router.get('/', function(req, res, next) { var user_type = req.query.user_type; if (user_type == 'P' || 'M' ) { client.query('SELECT * FROM user WHERE user_type = ?', user_type, function (err, rows, fields) { if(err) { console.log(err); } varusers = []; rows.forEach(function(row) { users.push({ id : row.id, username : row.username, address : row.address, price : row.price, user_type : row.user_type }); }); res.json({users: users}); }); } }); router/get(‘/’, callback)
  • 7. 3주차 첫번째 스터디 ­ Node.js Users 생성 (회원가입) router/post(‘/’, callback) /* users 생성(회원가입, insert) */ // moca.com/api/1/users router.post('/', function(req, res, next) { var data = { 'username': req.body.username, 'address' : req.body.address, 'price' : req.body.price } client.query('INSERT * into user SET ?', data, function(err, rows, fields) { if (err) { conosole.log(err); } res.status(200); }); });
  • 8. 3주차 첫번째 스터디 ­ Node.js Users (회원정보수정) router/put(‘/:user_id’, callback) /* 모델/작가 등록하기 & 정보수정하기 - 가입하기와 다름. 이들은 가입을 했기 때문에 user_id를 발급받았음 */ // moca.com/api/1/users/2?user_type=M router.put('/:user_id', function(req, res, next) { var user_id = req.params.user_id; var user_type = req.query.user_type; client.query('UPDATE user SET user_type = ? WHERE id = ?', [user_type, user_id], function(err, rows, fields) { if (err) { console.log(err); } }); });
  • 9. 3주차 첫번째 스터디 ­ Node.js Users (전체유저 조회) Router/get(‘/’, callback) /* 전체 유저 조회 - 나중에 admin 만들 때 활용 */ // moca.com/api/1/users router.get('/', function(req, res, next) { var user_type = req.query.user_type; client.query('SELECT * FROM user WHERE user_type = ?', user_type, function (err, rows, fields) { if(err) { console.log(err); } varusers = []; rows.forEach(function(row) { users.push({ id : row.id, username : row.username, address : row.address, price : row.price, user_type : row.user_type }); }); res.json({users: users}); }); });
  • 10. 3주차 첫번째 스터디 ­ Node.js books (전체사진첩 조회) Router/get(‘/’, callback) /* books 전체에 대한 조회(select) */ router.get('/', function(req, res, next) { client.query('SELECT b.id AS books_id, b.username AS books_username, i.img_url AS img_url_img_url FROM books b JOIN img_url i ON b.img_url1 = i.id', function (err, rows, fields) { if(err) { console.log(err); } varbooks = []; rows.forEach(function(row) { books.push({ id : row.books_id, username : row.books_username, img_url : row.img_url_img_url }); }); res.json({books: books}); }); });
  • 11. 3주차 두번째 스터디 ­ Node.js 쿠키와 세션 데이터를 어디에 저장할 것인가? 보안, 데이터의 양, … connect.sid ­ 사용자의 식별자 (아이디와 비밀번호를 브라우저에 저장하지 않는다)
  • 12. 3주차 첫번째 스터디 ­ Node.js 로그인 view(get) app.get('/auth/login', function(req, res) { var output = ` <h1>Login</h1> <form action='/auth/login' method='post'> <p><input type='text' name='username' placeholder='useranme’></p> <p><input type='password' name='password' placeholder='password’></p> <p><input type="submit”></p> </form> `; res.send(output); }); template strings
  • 13. 3주차 첫번째 스터디 ­ Node.js 로그인 로직(post) app.post('/auth/login', function(req, res) { var user = { username: 'kevin', password: '1234', displayName: 'kevin hong' }; var uname = req.body.username; var pwd = req.body.password; if(uname === user.username && pwd === user.password) { res.redirect('/welcome'); } else { res.send('Who are you? <a href="/auth/login">login</a>'); } }); var express = require('express'); var session = require('express-session'); var bodyParser = require('body-parser');
  • 14. 3주차 첫번째 스터디 ­ Node.js 세션 var express = require('express'); var session = require('express-session'); var bodyParser = require('body-parser'); var MySQLStore = require('express-mysql-session')(session); app.use(session({ secret: 'djfivjdFDjfh1@1@$ei%#213#', resave: false, saveUninitialized: true, store: new MySQLStore({ host: 'localhost', port: 3306, database: 'test' }) }));
  • 15. 3주차 첫번째 스터디 ­ Node.js 로그인 + 세션 app.post('/auth/login', function(req, res) { var user = { username: 'kevin', password: '1234', displayName: 'kevin hong' }; var uname = req.body.username; var pwd = req.body.password; if(uname === user.username && pwd === user.password) { req.session.displayName = user.displayName; req.session.save(function() { res.redirect('/welcome'); }); } else { res.send('Who are you? <a href="/auth/login">login</a>'); } }); app.get('/welcome', function(req, res) { if (req.session.displayName) { res.send(` <h1>Hello, ${req.session.displayName}<h1> <a href="/auth/logout">logout</a> `); } else { res.send(` <h1>Welcome</h1> <a href="/auth/login">Login</a> `); } });
  • 16. 3주차 첫번째 스터디 ­ Node.js DB에 세션 저장하기
  • 17. 3주차 첫번째 스터디 ­ Node.js md5 SHA256 pbkdf2-password npm salt if(uname === user.username && pwd === user.password)
  • 18. 3주차 첫번째 스터디 ­ Node.js passport js redis Strategy: local, facebook
  • 19. 3주차 첫번째 스터디 ­ Node.js Ejs로 json api 파싱하기 쿠키
  • 20. Node.js 심화과정 신촌 크레바스 스터디 - 3주차 두번째 로그인/회원가입 홍석유 syhong0714@gmail.com
  • 21. 3주차 두번째 스터디 ­ Node.js pbkdf2-password npm var bkfd2Password = require("pbkdf2-password"); var hasher = bkfd2Password(); crypto hasher({password:pwd, salt:user.salt}, function(err, pass, salt, hash) { if(hash === user.password) { done(null, user); } else { done(null, false); } });
  • 22. 3주차 두번째 스터디 ­ Node.js pbkdf2-password npm crypto
  • 23. 3주차 두번째 스터디 ­ Node.js passport.js Strategy Local Strategy Facebook Str Google Str Twitter Str Kakao, Naver, …
  • 24. Passport - local var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; app.post( '/auth/login', passport.authenticate( 'local', { successRedirect: '/welcome', failureRedirect: '/auth/login', failureFlash: false } ) ); passport.use(new LocalStrategy( function(username, password, done) { varuname = username; varpwd = password; for (var i = 0; i < users.length; i++) { varuser = users[i]; if(uname === user.username) { return hasher({password:pwd, salt:user.salt}, function(err, pass, salt, hash) { if(hash === user.password) { done(null, user); } else { done(null, false); } }); } } done(null, false); } )); 3주차 두번째 스터디 ­ Node.js
  • 25. Passport - FB var passport = require('passport'); var FacebookStrategy = require('passport- facebook').Strategy; app.get( '/auth/facebook', passport.authenticate( 'facebook' ) ); app.get( '/auth/facebook/callback', passport.authenticate( 'facebook', { successRedirect: '/welcome', failureRedirect: '/auth/login' } ) ); passport.use(new FacebookStrategy({ clientID: '2925359214154649', clientSecret: '0966dbedda54bbafe984f7e12bcd0c40', callbackURL: "/auth/facebook/callback" }, function(accessToken, refreshToken, profile, done) { varauthID = 'facebook:'+profile.id; for (var i = 0; i < users.length; i++) { varuser = users[i]; if (user.authId === authId) { return done(null, user); } } varnewuser = { 'authId' : authId, 'displayName' : profile.displayName }; users.push(newuser); done(null, newuser); } )); 3주차 두번째 스터디 ­ Node.js
  • 26. Passport - FB 3주차 두번째 스터디 ­ Node.js
  • 27. Passport - session passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { for (var i = 0; i < users.length; i++) { varuser = users[i]; if(user.id === id) { done(null, user); } } }); app.use(passport.initialize()); app.use(passport.session()); 3주차 두번째 스터디 ­ Node.js
  • 28. Passport - session passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { for (var i = 0; i < users.length; i++) { varuser = users[i]; if(user.id === id) { done(null, user); } } }); app.use(passport.initialize()); app.use(passport.session()); 3주차 두번째 스터디 ­ Node.js
  • 29. Passport - 구현예제 app.get('/auth/login', function(req, res) { var output = ` <h1>Login</h1> <form action='/auth/login' method='post'> <p><input type='text' name='username' placeholder='useranme'></p> <p><input type='password' name='password' placeholder='password'></p> <p><input type="submit"></p> </form> <a href="/auth/facebook">facebook</a> `; res.send(output); }); 3주차 두번째 스터디 ­ Node.js
  • 30. Ejs로 json api 파싱하기 쿠키 redis 3주차 두번째 스터디 ­ Node.js
  • 31. Node.js 심화과정 신촌 크레바스 스터디 - 3주차 세번째 이미지 업로드 홍석유 syhong0714@gmail.com
  • 32. 3주차 세번째 스터디 ­ Node.js 이미지업로드 모듈 aws-sdk formidable multer multer-s3 mysql 멀티이미지업로드 이미지업로드 & DB저장
  • 33. 3주차 세번째 스터디 ­ Node.js 싱글이미지 upload var AWS = require('aws-sdk'); AWS.config.region = 'ap-northeast-1'; var s3 = new AWS.S3(); var formidable = require('formidable'); var fs = require('fs'); var client = mysql.createConnection({ host: 'localhost', user: 'root', database: 'test' }); <html> <body> <form action="/api/1/books" method="post" enctype="multipart/form- data"> <input type="file" name="userfile"> <input type="submit"> </form> </body> </html>
  • 34. 3주차 세번째 스터디 ­ Node.js 싱글이미지 upload alt + tab
  • 35. 3주차 세번째 스터디 ­ Node.js 멀티이미지 upload var express = require('express'); var bodyParser = require('body-parser'); var multer = require('multer'); var multerS3 = require('multer-s3'); var AWS = require('aws-sdk'); AWS.config.region = 'ap-northeast-1'; var app = express(); var s3 = new AWS.S3(); app.use(bodyParser.json()); <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form action="/api/1/multers3" method="post" enctype="multipart/form-data"> <input type="file" name="userPhoto" multiple /> <input type="submit"> </form> </body> </html>
  • 36. 3주차 세번째 스터디 ­ Node.js 멀티이미지 upload app.get('/multers3', function(req, res) { res.sendFile(__dirname + '/public/uploadform.html'); }); app.post('/api/1/multers3', upload.array('userPhoto', 10), function(req, res, next) { res.send('uploaded!'); }); var upload = multer({ storage: multerS3({ s3 : s3, bucket : 'mocatest', acl : 'public-read', key : function(req, file, callback) { callback(null, file.originalname); } }) });