강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của minseokkim0824
minseokkim0824

câu hỏi đã được viết

Hiểu JavaScript phụ trợ thông qua phát triển web Node.js

Xử lý phiên dựa trên hộ chiếu

deserializeUser가 호출이 되지 않습니다. undefined문제

Viết

·

628

1

안녕하세요, nodejs를 이 강의로 학습하고 있는 학생입니다. 이 영상을 보고 따라했는데 제 컴퓨터에서 deserializeUser가 호출되지 않고 그에 따라서 main.js가 컴퓨터 network에서 404를 나타내며 user에 값을 담아내지 못하고 있었습니다 소스코드는 다음과 같습니다.  그리고 결과값은 아래처럼 나왔습니다. 인터넷에서는 cookie secure를 false로 하면 해결할 수 있다그래서 시도해보았는데 잘 모르겠어서 이렇게 글을 올립니다 감사합니다. 

// 결과값입니다.

get join url

Session {

  cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true },

  flash: {}

}

47

passport session save :  47

{ email: '1234ㄹa', id: 47 }

main js loaded undefined

Session {

  cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true },

  flash: {},

  passport: { user: 47 }

}

//여기 아래가 소스코드입니다

router.get('/', function(req, res){
  var msg;
  var errMsg = req.flash('error') 
  if(errMsg) msg = errMsg;
  console.log('get join url');
  console.log(req.session)
  res.render('join.ejs', {'message' : msg});
})

passport.serializeUser(function(user, done){ 
  console.log('passport session save : ', user.id);
  console.log(user);
  done(null, user.id);
})

passport.deserializeUser(function(id, done){
  console.log('passport session get id data: ');
  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('existed user');
        return done(null, false, {message : 'your email is already used'})
      }
      else
      {
        var sql = {email: email, name: 'hi', 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});
        })
      }
    })
  }
));

//passport routing 처리
router.post('/', passport.authenticate('local-join', { 
  successRedirect: 'main',
  failureRedirect: 'join',
  failureFlash: true
}));

module.exports = router;
javascriptexpressnodejs

Câu trả lời 2

0

passport.deserializeUser((id, done) =>{// seesion 에서 id값을 뽑아서 처리 해주는 곳console.log('passport session get id data: ', id);

//여기서 db의 값을 찾아서 사이트에 띄워주기 가능

done(null, id); //세션의 값을 뽑아서 전달해주는 역할

});

 

여기서 db조회해올때 id 값이 0이 나오면 0을 undefined라고 인식하는 것 같아요.

문자열이나 0이외의 값들을 넣어보시면 잘 작동되는 마법을 경험하실 겁니다.

0

저도 여기서 막혔는데 혹시 해결하셨나요??

minseokkim0824님의 프로필 이미지
minseokkim0824
Người đặt câu hỏi

기억이 잘 나진 않는데 이거 한번 돌려보시겠어요? 순서 때문에 차이가 생겼나 그랬던거 같습니다. 

var express = require('express')
var app = express()
var router = express.Router()
var path = require('path');

var bodyParser = require('body-parser'); // bodyparser 불러오는거 이제 express 서버한테 바디파서 쓴다고 말해야함
var mysql = require('mysql');
var cookieParser = require('cookie-parser');


/* 이런거 깃헙 사이트에서 예습이나 공부 많이 필요 */
var passport = require('passport'); // passport 쓰는거
var LocalStrategy = require('passport-local').Strategy; // 깃헙에서 찾아보기
var session = require('express-session');
var flash = require('connect-flash');

var connection = mysql.createConnection(
{
host : 'localhost',
port : '3306',
user : 'root',
password : '1124ms',
database : 'minstone_test'
}
)
app.use(cookieParser());

passport.initialize();
passport.session();

connection.connect();
//passport routing 처리
router.post('/', passport.authenticate('local-join', { // 원래는 요 부분도 콜백으로 해야하는데 이렇게 하면 콜백함수 동작하는거처럼 해준다.
//authenticate가 내부에 이 세개를 알아서 비동기 해줄지도..?
successRedirect: 'main',
failureRedirect: 'join',
failureFlash: true
}));

// passport에 대한 정의를 해줄 필요가 있다.
router.get('/', function(req, res){
var msg;
var errMsg = req.flash('error') // error메세지를 받으려면 이렇게 해야함
if(errMsg) msg = errMsg;
console.log('get join url');
res.render('join.ejs', {'message' : msg});
})

passport.serializeUser((user, done) => { //콜백에서 던으로 폴스 안주고 개체를 주면, 그 개체를 바당서 쓰는거
console.log('passport session save : ', user.id);
done(null, user.id);
});

passport.deserializeUser((id, done) =>{// seesion 에서 id값을 뽑아서 처리 해주는 곳
console.log('passport session get id data: ', id);
//여기서 db의 값을 찾아서 사이트에 띄워주기 가능
done(null, id); //세션의 값을 뽑아서 전달해주는 역할
});

// 아래 코드를 strategy를 불러서 사용하는 방식
passport.use('local-join', new LocalStrategy // 요청이 들어왔을 때 호출되는 콜백함수 done을 써서 비동기 동작이 멈춘다. 비동기 테스트
(
{
usernameField: 'email',
passwordField: 'password',
session: true,
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('existed user');
return done(null, false, {message : 'your email is already used'}) // false남기면 아래 post에 failureRedirect로 가준다.
}
else
{
var sql = {email: email, name: 'hi', pw: password};
var query = connection.query('INSERT INTO user SET ?', sql, function(err, rows)
{
if(err) throw err;
var myId = rows.insertId;
console.log(myId);

return done(null, {'email' : email, 'id' : rows.insertId}); // serialize에러가 발생을 했다. 세션을 처리해주는 부분이 필요했다. done을 할 경우 serialize 메소드를 불러서 실행할 부분을 찾는거다.
// done이 fail이 아닌경우 serialize에 등록된 방법, 콜백함수대로 처리하게 되어있음 그래서 선언 필요
})
}
})
}
));

// form 부분 주석으로 처리
// // join html보면 또 action이 join이야 그거는 get 과 postrk ekfmsep,
// // post 는 이렇게 한다.
// router.post('/', function(req,res){
// var body = req.body;
// var email = body.email;
// var name = body.name;
// var passwd = body.password;
//
// var sql = {email : email, name : name, pw : passwd};
//
// var query = connection.query("INSERT INTO user set ?", sql,
// function(err,rows){
// if(err) {throw err;}
// console.log("ok db insert : ", rows.insertId, name);
// res.render('welcome.ejs', {'name' : name, 'id' : rows.insertId});
// })
// })

module.exports = router;
Hình ảnh hồ sơ của minseokkim0824
minseokkim0824

câu hỏi đã được viết

Đặt câu hỏi