Bepoz
파즈의 공부 일기
Bepoz
전체 방문자
오늘
어제
  • 분류 전체보기 (232)
    • 공부 기록들 (85)
      • 우테코 (17)
    • Spring (85)
    • Java (43)
    • Infra (17)
    • 책 정리 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Bepoz

파즈의 공부 일기

2020.02.14 & 02.17 백엔드 공부(5),(6)
공부 기록들

2020.02.14 & 02.17 백엔드 공부(5),(6)

2020. 2. 18. 16:16

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')

app.use(router)

불러오는 중입니다...

 

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

 

jaredhanson/passport

Simple, unobtrusive authentication for Node.js. Contribute to jaredhanson/passport development by creating an account on GitHub.

github.com

이곳에 설명이 쓰여져있다.

 

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 있을때에 저렇게 넘겨준다.

<%=message %> 를 join.ejs에 넣어주었다.

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
    '공부 기록들' 카테고리의 다른 글
    • 2020.02.25-28 백엔드 공부(8)
    • 2020.02.19 백엔드 공부 (7)
    • 2020. 02. 10 백엔드 공부(4)
    • 2020.02.04 백엔드 공부(3) (Ajax, express, body-parser, ejs)
    Bepoz
    Bepoz
    https://github.com/Be-poz/TIL

    티스토리툴바