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
'프로그래밍 > Node.js' 카테고리의 다른 글
Node.js 생활코딩 정리 - CRUD + Auth MYSQL 버전 라우트 복잡도 낮추기 (0) | 2016.12.18 |
---|---|
Node.js 생활코딩 정리 – CRUD + Auth MYSQL버전을 여러 개의 파일로 나누기3 (0) | 2016.12.16 |
Node.js 생활코딩 정리 – CRUD+Auth MYSQL버전을 여러개의 파일로 나누기2 (0) | 2016.12.14 |
Node.js 생활코딩 정리 – CRUD + Auth MYSQL버전을 여러개의 파일로 나누기 1 (0) | 2016.12.13 |
Node.js 생활코딩 정리 – 사용자 정의 모듈 만들기 (0) | 2016.12.11 |
Node.js 생활코딩 정리 – jade extends 란? (0) | 2016.12.10 |
Node.js 생활코딩 정리 – Mysql을 이용한 Login 구현 (0) | 2016.12.09 |
Node.js 생활코딩 정리 – MYSQL을 이용한 회원가입(Register) (0) | 2016.12.08 |