app.js에 라우팅을 다 처리하도록 하지말고 따로 js 파일을 만들어서 처리하게끔 한다.
var router=express.Router();
module.exports=router;
써주고, app.js 에서
var main=require('./router/main') 을 선언해준다.
그리고 app.use('/main',main) 을 하여 /main 이 들어오면 위의 main 인 router/main 으로 가게끔
router.get('/',function(req,res){
res.sendFile(path.join(__dirname,'../public/main.html'))
})
상대 경로에서 router 안에 public이 없기에 ../public 을 해주었는데, 이 dirname 과 뒤의 경로를 합쳐주기 위해 path.join을 사용하였고,
var path=require('path')를 선언해주었다.
form.html 의 email_post 와 ajax_send 처리 또한 var email=require('./router/email') 로 선언하고 email.js 를 따로 만들어서 그곳에서 처리를 해준다.
router.post('/form',function(req,res){
console.log(req.body.email)
res.render('email.ejs',{'email':req.body.email})
})
이렇게 /form 으로 아예 바꿔주었다. 물론 form.html 내의 내용도 수정해주었다.
action="/email/form" 이렇게 말이다.
body-parser의 경우 app에 설정을 해두면 main 이나 email에서도 사용할 수 있다.
이제 app.js에서 모든 것을 처리해주는 것이 아니라 index.js 에서 한 번에 처리하게끔 만들어 준다.
var router=require('./router/index')
var express=require('express')
var app=express()
var router=express.Router()
var path=require('path')
var main=require('./main')
var email=require('./email')
var search=require('./search')
router.get('/',function(req,res){
res.sendFile(path.join(__dirname,"../public/main.html"))
})
router.use('/main',main)
router.use('/email',email)
router.use('/search',search)
module.exports=router;
경로를 ./ 으로 바꾸었다. 같은 경로안에 있기 때문에. app.use 는 router.use로
뒤에 url 이 같더라도 get 과 post 차이면 같을 수 있다. join html에서 action /join 으로 post로 보낸다고 해서 get 의 join 으로 들어가는건 아니라는 것이다.
router.post('/',function(req,res){
var body=req.body;
var email=body.email;
var name=body.name;
var passwd=body.password;
var query=connection.query('insert into user (email,name,pw) values ("'+email+'","'+name+'","'+passwd+'")',function(err,rows){
if(err) {throw err;}
console.log("ok db insert");
})
})
다음과 같이 db에까지 넣어주었다.
인증 절차를 위하여
passport, passport-local express-session connect-flash 를 설치해 주었다.
var passport=require('passport')
var LocalStrategy = require('passport-local').Strategy;
var session = require('express-session')
var flash=require('connect-flash')
선언
https://github.com/jaredhanson/passport
이곳에 설명이 쓰여져있다.
router/join/index.js 에
router.get('/',function(req,res){
var msg;
var errMsg=req.flash('error')
if(errMsg) msg=errMsg;
res.render('join.ejs',{'message':msg})
})
errMsg 있을때에 저렇게 넘겨준다.
passport.serializeUser(function(user,done){
console.log('passport session save : ',user.id)
done(null,user.id)
})
passport.deserializeUser(function(id,done){
console.log('passport session get id : ',id)
done(null,id);
})
passport.use('local-join',new LocalStrategy({
usernameField:'email',
passwordField:'password',
passReqToCallback : true
},function(req,email,password,done){
var query=connection.query('select *from user where email=?',[email],function(err,rows){
if(err) return done(err);
if(rows.length){
console.log('user existed')
return done(null,false,{message:'your email is already used'})
}else{
var sql={email: email, pw:password};
var query=connection.query('insert into user set?',sql,function(err,rows){
if(err) throw err
return done(null,{'email':email, 'id': rows.insertId})
})
}
})
}))
router.post('/',passport.authenticate('local-join',{
successRedirect:'/main',
failureRedirect: '/join',
failureFlash: true
}))
post를 하면서 passport.authenticate 으로 위에 선언한 것을 해주었는데, 성공시에는 /main 에 실패시에는 /join 으로 보낸다.
done(null,false) 면 실패인 것이다. /// post로 들어온 것이고 redirect 시에 get 방식으로 작동된다.
위의 경우 db에 없을 시 insert를 하고 email과 id 값을 넣는데 이것이 이제
serializeUser 에서 저장이 되고, deserializeUser에서 값을 받아 저장한다. 이 값은 req.user로 접근할 수 있다.
serializeUser 에서의 done의 2번째 인자가 deserial 의 1번째 매개변수로 들어간다. 저렇게 안하고 user.id 대신 user 자체를 넘겨줘도 된다.
main.ejs에서
router.get('/',function(req,res){
//res.sendFile(path.join(__dirname,'../../public/main.html'))
res.render('main.ejs',{'id':req.user})
})
로 req.user를 받아온 코드이다.
'공부 기록들' 카테고리의 다른 글
2020.02.25-28 백엔드 공부(8) (0) | 2020.02.28 |
---|---|
2020.02.19 백엔드 공부 (7) (0) | 2020.02.19 |
2020. 02. 10 백엔드 공부(4) (0) | 2020.02.10 |
2020.02.04 백엔드 공부(3) (Ajax, express, body-parser, ejs) (0) | 2020.02.05 |
2020.02.03 백엔드 공부(2) (0) | 2020.02.03 |