처음하는개발
329
2021-05-23 23:39:57
6
208

nodejs 세션설정 도움이 필요합니다...ㅠㅠ


로그인하면서 세션을 설정하고싶은데 구글보고 미들웨어설정을 똑같이했는데 세션설정이안되네요 ㅠㅠ 

이것때문에 지금 몇시간째 찾고있는데 도움이 절실합니다 ㅠㅠ

mysqlstore를 사용하였고 데이터베이스에 sessions테이블은 만들어졌는데 값이 들어가질않습니다 ㅠㅠ


app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var session = require('express-session');
var MySQLStore = require("express-mysql-session")(session);
var bodyParser = require('body-parser')


var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var formRouter = require('./routes/form');
var mysqlRouter = require('./routes/mysql');
var boardRouter = require('./routes/board');
var loginRouter = require('./routes/login');
var joinRouter = require('./routes/join');
var passwordchangeRouter = require('./routes/passwordchange');
var userdeleteRouter = require('./routes/userdelete');

var app = express();

//bodyparser
app.use(bodyParser.json());

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/form', formRouter);
app.use('/mysql', mysqlRouter);
app.use('/board', boardRouter);
app.use('/login', loginRouter);
app.use('/join', joinRouter);
app.use('/passwordchange', passwordchangeRouter);
app.use('/userdelete', userdeleteRouter);

var options = {
  host: "localhost",
  port: 3306,
  user: "node",
  password: "1234",
  database: "test",
};

var sessionStore = new MySQLStore(options);
app.use(bodyParser.urlencoded({ extended: false }));

app.use(
  session({
    key: "testkey",
    secret: "secret code",
    store: sessionStore,
    resave: false,
    saveUninitialized: true,
  })
);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});



module.exports = app;


login.js

var express = require('express');
var router = express.Router();
var mysql_odbc = require('../db/db_conn')();
var conn = mysql_odbc.init();

/* GET login page. */
router.get('/', function (req, res, next) {
    res.render('login')
});

router.post('/', function (req, res, next) {
  var userId = req.body['userId'];
  var userPw = req.body['userPw'];
  conn.query('select * from testuser where testid=? and testpwd=?',[userId,userPw], function (err, rows, fields) {
      if (!err) {
          if (rows[0]!=undefined) {       
              res.send('id : ' + rows[0]['testid'] + '<br>' +
                  'pw : ' + rows[0]['testpwd']);
                  console.log(req.session);
          } else {
              res.send('no data');
          }

      } else {
          res.send('error : ' + err);
      }
  });
});

module.exports = router;

로그인성공시 확인해보려고 consloe를 써봤는데 undefinded가 뜹니다 ㅠㅠ


login.ejs

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
<h1>login</h1>
<form method='post' action='login'>
    <label>id :</label><input type="text" name="userId"><br>
    <label>pw :</label><input type="password" name="userPw"><br>
    <input type="submit">
</form>
</body>
</html>


정말 몇시간째 이것만 헤메고있습니다 도움이절실합니다.. 선배님들께 도움을 요청합니다 ㅠㅠ

0
  • 답변 6

  • 안녕디지몬
    218
    2021-05-23 23:52:43

    이렇게 보니 알겠군요 ㅎㅎㅎㅎ

  • 처음하는개발
    329
    2021-05-23 23:54:53

    제가 무엇을 잘못한걸까요 ...??

  • 안녕디지몬
    218
    2021-05-23 23:56:43
    app.use('/', indexRouter);
    app.use('/users', usersRouter);
    app.use('/form', formRouter);
    app.use('/mysql', mysqlRouter);
    app.use('/board', boardRouter);
    app.use('/login', loginRouter);
    app.use('/join', joinRouter);
    app.use('/passwordchange', passwordchangeRouter);
    app.use('/userdelete', userdeleteRouter);
    
    var options = {
      host: "localhost",
      port: 3306,
      user: "node",
      password: "1234",
      database: "test",
    };
    
    var sessionStore = new MySQLStore(options);
    app.use(bodyParser.urlencoded({ extended: false }));
    
    app.use(
      session({
        key: "testkey",
        secret: "secret code",
        store: sessionStore,
        resave: false,
        saveUninitialized: true,
      })
    );

    미들웨어 순서가 잘못되었습니다.

    app.use(logger('dev'));
    app.use(express.json());
    app.use(express.urlencoded({ extended: false }));
    app.use(cookieParser());
    app.use(express.static(path.join(__dirname, 'public')));
    
    var options = {
      host: "localhost",
      port: 3306,
      user: "node",
      password: "1234",
      database: "test",
    };
    
    var sessionStore = new MySQLStore(options);
    app.use(bodyParser.urlencoded({ extended: false }));
    
    app.use(
      session({
        key: "testkey",
        secret: "secret code",
        store: sessionStore,
        resave: false,
        saveUninitialized: true,
      })
    );
    
    app.use('/', indexRouter);
    app.use('/users', usersRouter);
    app.use('/form', formRouter);
    app.use('/mysql', mysqlRouter);
    app.use('/board', boardRouter);
    app.use('/login', loginRouter);
    app.use('/join', joinRouter);
    app.use('/passwordchange', passwordchangeRouter);
    app.use('/userdelete', userdeleteRouter);

    이렇게 router 와 session 미들웨서 순서를 바꿔야 req.session 이 더 이상 undefined가 나오지 않을겁니다.

  • 처음하는개발
    329
    2021-05-24 00:04:51

    아.. 순서가 상관있는건줄은 미처생각지도 못했습니다...ㅠㅜ

    req.session은 이제 오류가 안나고 데이터베이스에도 값이 저장이됩니다. 너무감사합니다!!

  • 안녕디지몬
    218
    2021-05-24 00:12:28

    개념을 잡기에 도움 되시라고 몇 글자 더 적어드립니다.

    코드가 실행 될때, node는 위에서부터 아래로 컨텍스트를 뜹니다(다른 말로 스택을 쌓는다).

    원래 코드 기준으로

    로그인 router를 타고가서 loginRouter 코드를 실행한다고 하면

    그때 app.use(session())이 설정 되지 않았던 것입니다.


    반면에 수정된 코드는

    로그인 router를 타기 전에

    app.use(session( ))을 통해서 session 설정을 하고

    loginRouter 함수를 실행하는 것이기에 req.session이 더이상 undefinded가 아닌 것입니다.


    session 설정이든 cookie 설정이든

    app.use(logger('dev'));
    app.use(express.json());
    app.use(express.urlencoded({ extended: false }));
    app.use(cookieParser());

    이 부분을 왜 미들(middle)웨어 설정이라고 하는지 그 이름에서 어떤 느낌인지 감을 잡으실거라 봅니다.



  • 처음하는개발
    329
    2021-05-24 00:41:53
    몇시간동안 못하다가 정말 큰도움받고갑니다!! 복받으실거에요 감사합니다
  • 로그인을 하시면 답변을 등록할 수 있습니다.