본문 바로가기

Javascript

[JavaScript] Mysql2 로 DB data 비동기로 가져오기 예제

반응형

 

mysql2 가 아닌 mysql 을 쓴 server.js 코드 

const express = require('express');
const nunjucks = require('nunjucks');
const bodyParser = require('body-parser');
const tokenKey = require('./JWT');
const cryptoPW=require('./cryptoPW')
const auth = require('./middleware/auth');
const mysql = require('mysql') 
const session=require('express-session');
const app = express();

nunjucks.configure('views', {
    express: app,
})
app.set('view engine', 'html');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false, }))
app.use(express.static('public'));
app.use(session({
    secret:'aa',
    resave:true,
    secure:false,
    saveUninitialized:false,
}))

let connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '5353',
    database: 'user0530'
})
connection.connect();

app.get('/', (req, res) => {
    res.render('index.html');
})

app.get('/user/join', (req, res) => {
    res.render('join.html');
})

app.post('/user/join_success', (req, res) => {
    let { userid, userpw, username } = req.body;
    let cryptoUserpw = cryptoPW(userpw);
    //db에 넣기 
    let sql = `insert into user (userid,userpw,username) values ('${userid}', '${cryptoUserpw}','${username}')`;
    connection.query(sql, (error, results) => {
        if (error) {
            console.log(error)
        } else {
            console.log(results);
        }
    });
    res.redirect('/');
})

app.post('/auth/local/login', (req, res) => {
    let { userid, userpw } = req.body;
    let result = {
        result: false,
        msg: '아이디와 비밀번호를 확인해주세요.'
    };
    
    let sql = `select * from user where userid='${userid}'`;
    connection.query(sql, (error, results) => {
        if (error || results=='') {
            console.log(error);
        } else {
            let DB_userid = results[0].userid; // db
            let DB_userpw = results[0].userpw; // db
            let cryptoUserpw = cryptoPW(userpw); //고객이 입력한pw 암호화
            if (userid == DB_userid && cryptoUserpw == DB_userpw) {
                let token = tokenKey(userid);
                res.cookie('accessToken', token, { httpOnly: true, secure: true, });
                result = {
                    result: true,
                    msg: '로그인 성공'
                }
            }
        }
        req.session.userid = userid;
        res.json(result)
    })
})

app.get('/user/info', auth, (req, res) => {
    let userid = req.userid;
    res.send(`${userid}님의 회원정보는 아래와 같습니다.`)
})

app.listen(3000, () => {
    console.log('server start port:3000')
})

 

요 아래 부분에서 

app.post('/auth/local/login', (req, res) => {
    let { userid, userpw } = req.body;
    let result = {
        result: false,
        msg: '아이디와 비밀번호를 확인해주세요.'
    };
    
    let sql = `select * from user where userid='${userid}'`;
    connection.query(sql, (error, results) => {
        if (error || results=='') {
            console.log(error);
        } else {
            let DB_userid = results[0].userid; // db
            let DB_userpw = results[0].userpw; // db
            let cryptoUserpw = cryptoPW(userpw); //고객이 입력한pw 암호화
            if (userid == DB_userid && cryptoUserpw == DB_userpw) {
                let token = tokenKey(userid);
                res.cookie('accessToken', token, { httpOnly: true, secure: true, });
                result = {
                    result: true,
                    msg: '로그인 성공'
                }
            }
        }
        req.session.userid = userid;
        res.json(result)
    })
})

sql 명령으로 가져온 결과 results 가 동기식이다 

 

    let sql = `select * from user where userid='${userid}'`;
    connection.query(sql, (error, results) => {
        if (error || results=='') {
            console.log(error);
        } else {
            let DB_userid = results[0].userid; // db    /
            let DB_userpw = results[0].userpw; // db
        }
      let cryptoUserpw = cryptoPW(userpw); //고객이 입력한pw 암호화
      if (userid == DB_userid && cryptoUserpw == DB_userpw) {
      let token = tokenKey(userid);
      res.cookie('accessToken', token, { httpOnly: true, secure: true, });
      result = {
          result: true,
          msg: '로그인 성공'
      }
     
        req.session.userid = userid;
        res.json(result)
    })

 

위의 코드처럼 let cryptoUserpw 부터 if 절 밖으로 뺴내고 싶었는데 이렇게 하면 DB_userid, DB_userpw 값이 undefined가 뜬다. connection 부분에 results 결과가 담기고 변수에 들어가야하는데 아래 코드가 먼저 실행기 때문같다. 

 

비동기가 가능한 mysql2 를 사용해서 아래처럼 바꾸면 가능하다. 

 

const mysql2 = require('mysql2/promise');     // 추가 1111

let mysqlInfo = {
    host: 'localhost',
    user: 'root',
    password: '5353',
    database: 'user0530'
}
let connection = mysql.createConnection(mysqlInfo)
let connection2 = mysql2.createConnection(mysqlInfo)   // 추가 22222

app.post('/auth/local/login', async (req, res) => {
    let { userid, userpw } = req.body;
    let result = {
        result: false,
        msg: '아이디와 비밀번호를 확인해주세요.'
    };

    let sql = `select * from user where userid='${userid}'`;
    let [DB_results] = await (await connection2).execute(sql);      //수정 33333
    // [] 없이 그냥 DB_results 하면 결과값에 [0][0] 두번 줘야함 

    let DB_userid = DB_results[0].userid; // db
    let DB_userpw = DB_results[0].userpw; // db
    let cryptoUserpw = createPW(userpw); //고객이 입력한pw 암호화

    if (userid == DB_userid && cryptoUserpw == DB_userpw) {
        let token = createToken(userid);
        res.cookie('accessToken', token, { httpOnly: true, secure: true, });
        result = {
            result: true,
            msg: '로그인 성공'
        }
    }

    req.session.userid = userid;
    res.json(result)

})

let [DB_results] = await (await connection2).execute(sql); 

요 부분에서 connection 도 비동기로 이루어져야 해서 앞에 await을 붙인다. 

 

 

반응형