프로그래밍/Node.js

Node.js 생활코딩 정리 – CRUD + Auth MYSQL 버전 모두 합치기

가카리 2016. 12. 19. 21:40
반응형

CRUD + Auth MYSQL 버전 모두 합치기

 

마지막으로 app_mysql2.js에다가 app_multi_user_mysql3.js의 소스를 합쳐서 로그인과 CRUD기능이 있는 웹애플리케이션을 만들어보자

 

이번에는 app_mysql2.js를 복사해서 app_mysql3.js를 만들어서 작업을 한다.

 

 

app_mysql3.js

 

var app = require('./config/mysql/express')();

var passport = require('./config/mysql/passport')(app);//반드시 패스포트는 위쪽에 써야됨

var auth = require('./routes/mysql/auth')(passport);//auth.js파일 불러옴 passport 함수의인자로 넘겨줌

app.use('/auth', auth);//auth 접근하는 모든 접근을 auth라는 라우터로 위임함

 

var topic = require('./routes/mysql/topic')();

app.use('/topic', topic);// topic으로 들어오면 topic이라는 객체에 위임함

 

app.listen(3003, function(){

console.log('Connected, 3003 port!');

})

 

 

routes/mysql/auth.js

 

module.exports = function(passport){//넘겨진 패스포트를 받음

var bkfd2Password = require("pbkdf2-password");

var hasher = bkfd2Password();

var conn = require('../../config/mysql/db')();//같은 디렉토리이므로 ./ 함수니까 호출임

var route = require('express').Router();//app route 바꿔야됨

 

route.get('/logout', function(req, res){

req.logout();

req.session.save(function(){

res.redirect('/topic');

});

});

 

route.post(

'/login',

passport.authenticate(

'local',

{

successRedirect: '/topic',//원래 welcome인데 topic으로 수정 161203

failureRedirect: '/login',

failureFlash: false

}

)

);

route.get(

'/facebook',

passport.authenticate(

'facebook',

{scope:'email'}

)

);

route.get(

'/facebook/callback',

passport.authenticate(

'facebook',

{

successRedirect: '/topic',//원래 welcome인데 topic으로 수정 161203

failureRedirect: '/login'

}

)

);

 

 

// var users = [

// {

// authId:'local:egoing',

// username:'egoing',

// password:'mTi+/qIi9s5ZFRPDxJLY8yAhlLnWTgYZNXfXlQ32e1u/hZePhlq41NkRfffEV+T92TGTlfxEitFZ98QhzofzFHLneWMWiEekxHD1qMrTH1CWY01NbngaAfgfveJPRivhLxLD1iJajwGmYAXhr69VrN2CWkVD+aS1wKbZd94bcaE=',

// salt:'O0iC9xqMBUVl3BdO50+JWkpvVcA5g2VNaYTR5Hc45g+/iXy4PzcCI7GJN5h5r3aLxIhgMN8HSh0DhyqwAp8lLw==',

// displayName:'Egoing'

// }

// ];

route.post('/register', function(req, res){

hasher({password:req.body.password}, function(err, pass, salt, hash){

var user = {

authId:'local:'+req.body.username,

username:req.body.username,

password:hash,

salt:salt,

displayName:req.body.displayName

};

var sql = 'INSERT INTO users SET ?';

conn.query(sql, user, function(err, results){

if(err){

console.log(err);

res.status(500);

} else {

req.login(user, function(err){

req.session.save(function(){

res.redirect('/welcome');

});

});

}

});

});

});

route.get('/register', function(req, res){

var sql = 'SELECT id, title FROM topic';//글목록을 보여주기 위한 쿼리문

conn.query(sql, function(err, topics, fields){

res.render('auth/register', {topics:topics});//topics 주입해줌161203

})

});

route.get('/login', function(req, res){

var sql = 'SELECT id, title FROM topic';//글목록을 보여주기 위한 쿼리문

conn.query(sql, function(err, topics, fields){

res.render('auth/login', {topics:topics});//topics 주입해줌161203

});

});

 

return route;

};

 

/views/mysql/auth/login.jade

 

extends ../layout

block content

form(action='/auth/login', method='post')

p

input(type='text', name='username', placeholder='username')

p

input(type='password', name='password', placeholder='password')

p

input(type='submit')

a(href='/auth/facebook') facebook

 

 

/views/mysql/auth/register.jade

 

extends ../layout

block content

h1 Register

form(action='/auth/register', method='post')

p

input(type='text', name='username', placeholder='username')

p

input(type='password', name='password', placeholder='password')

p

input(type='text', name='displayName', placeholder='displayName')

p

input(type='submit')

 

 

/routes/mysql/topic.js

 

module.exports = function(){

 

var route = require('express').Router();

var conn = require('../../config/mysql/db')();

 

//글작성하기

//new에서 add 바꿈

route.get('/add', function(req, res){

var sql = 'SELECT id, title FROM topic';//글목록을 보여주기 위한 쿼리문

conn.query(sql, function(err, topics, fields){

if(err){//에러가 있다면 여기서 처리

res.status(500).send('Internal Server Error');

}

res.render('topic/add', {topics:topics, user:req.user});

});

});

 

route.get(['/:id/edit'], function(req, res){

var sql = 'SELECT id, title FROM topic';//글목록을 보여주기 위한 쿼리문

conn.query(sql, function(err, topics, fields){

var id = req.params.id;//:id값을 가져옴

if(id){//id 있으면 상세보기

var sql = 'SELECT * FROM topic WHERE id=?';

conn.query(sql, [id], function(err, topic, fields){

if(err){//데이터베이스 에러가 있다면

console.log(err);

res.status(500).send('Internal Server Error');

}else{

res.render('topic/edit', {topics:topics, topic:topic[0], user:req.user});//topic 쿼리문의 데이터 한개만 넘겨줌

}

});

}else{//id값이 없다면 에러출력

console.log('There is no id.');

res.staus(500).send('Internal server error');

}

});

});

 

route.post(['/:id/edit'], function(req, res){

var title = req.body.title;

var description = req.body.description;

var author = req.body.author;

var id = req.params.id;

var sql = 'UPDATE topic SET title=?, description=?, author=? WHERE id=?';

conn.query(sql, [title, description, author, id], function(err, result, fields){

if(err){

console.log(err);

res.status(500).send('Internal Server Error');

}else{

//res.send(result);//이걸로 먼저 result값을 보고서 해야한다.

res.redirect('/topic/'+id);//변경후 이동 시켜라

}

});

});

 

route.get('/:id/delete', function(req, res){

var sql = 'SELECT id, title FROM topic';//글목록을 보여주기 위한 쿼리문

var id = req.params.id;

conn.query(sql, function(err, topics, fields){

var sql = 'SELECT * FROM topic WHERE id=?';

conn.query(sql, [id], function(err, topic){

if(err){//에러가 있다면 여기서 처리

res.status(500).send('Internal Server Error');

}else{

if(topic.length === 0){

console.log('There is no record.');

res.status(500).send('Internal Server Error');

}

// res.send(topic);//먼저 값을 보자

res.render('topic/delete', {topics:topics, topic:topic[0], user:req.user});

}

});

});

});

 

route.post('/:id/delete', function(req, res){

var id = req.params.id;

var sql = 'DELETE FROM topic WHERE id=?';

conn.query(sql, [id], function(err, result){

res.redirect('/topic/');//삭제되면 초기화면으로감

});

});

 

 

//폼에서 작성한 것을 여기서 받음

route.post('/add', function(req, res){

var title = req.body.title;//제목과 본문의 내용을 가져옴

var description = req.body.description;

var author = req.body.author;

var sql = 'INSERT INTO topic(title, description, author) VALUES(?, ?, ?)';

 

//쿼리문을 실행한다.

conn.query(sql, [title, description, author], function(err, result, fields){

if(err){//에러가 있다면 여기서 처리

res.status(500).send('Internal Server Error');

}

res.redirect('/topic/'+result.insertId);//insertId 입력한 행의 id값을 의미함

});

 

});

 

//글목록을 표시 mysql 버전

//[] 배열을 의미 둘다 여기로 접근 가능하다는

route.get(['/', '/:id'], function(req, res){

var sql = 'SELECT id, title FROM topic';//글목록을 보여주기 위한 쿼리문

conn.query(sql, function(err, topics, fields){

var id = req.params.id;//:id값을 가져옴

if(id){//id 있으면 상세보기

var sql = 'SELECT * FROM topic WHERE id=?';

conn.query(sql, [id], function(err, topic, fields){

if(err){//데이터베이스 에러가 있다면

console.log(err);

res.status(500).send('Internal Server Error');

}else{

res.render('topic/view', {topics:topics, topic:topic[0], user:req.user});//topic 쿼리문의 데이터 한개만 넘겨줌

}

});

}else{//첫화면을 보여줌

res.render('topic/view', {topics:topics, user:req.user});//view.jade파일을 출력함 쿼리문에서 가져온 값을 넘겨줌

}

});

});

 

return route;

}

 

 

/views/mysql/layout.jade

 

doctype html

html

head

meta(charset='utf-8')

body

ul#account

if user

li

a(href='/auth/logout') Logout

else

li

a(href='/auth/register') Register

li

a(href='/auth/login') Login

h1

a(href='/topic') Server Side Javascript

ul

each topic in topics

li

a(href='/topic/'+topic.id)= topic.title

block content

 

 

실행 결과는 이전과 같다.

 

 

출처 : https://opentutorials.org/course/2136

반응형