Framework/Node.js

Node / express / SQL Server / MS SQL database/Sequelize 사용 연결 / 로그인 / 회원가입

청렴결백한 만능 재주꾼 2021. 6. 11. 04:30
반응형

설치 해야 하는 것

npm install --save connect-redis; //레디스 연결을 위한 모듈
npm install --save sequelize;     // 데이터베이스와 node.js ORM시켜줌
npm install --save sequelize-cli; // 커맨드라인 인터페이스 - 터미널 명령어로 관리도 가능하게 해줌
npm install --save redis;         //Redis

node_modules/.bin/sequelize init

init을 하면 models folder와 config폴더가 생긴다. models- index.js(아래 참고)가 생기고 거기에 각종 내가 설정하고 싶은 것을 설정한다.

config/config.json(아래 참고)에서는 데이터베이스 정보를 넣는다.

//models/index.js
//자동으로 생긴 파일이지만 살짝 바꾸었다.
'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const db = {};
const gConfig = global.config;

let sequelize;

sequelize = new Sequelize(gConfig.db.database, gConfig.db.user, gConfig.db.password, gConfig.db);

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

db.VACATION = require('./employee')(sequelize, Sequelize);

module.exports = db;
//config/config.json
{
  "development": {
    "username": "root",
    "password": null,
    "database": "chat_db",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

 

 

//models/employee.js

'use strict';

module.exports = (sequelize, DataTypes) => {
  let employee = sequelize.define('employee', {
    first_name: DataTypes.STRING,
    last_name: DataTypes.STRING,
    phone_number: DataTypes.STRING,
    username: DataTypes.STRING(50),
    password: DataTypes.STRING(255)
  },
    {
      tableName: 'Employee'
    }
  );

  return employee;
};

 

 

 

 

//app.js
const sequelize = require('./models/index').sequelize;
sequelize.sync();

//이걸 해놓으면 nodemon이 켜질 때 마다 model에 있는 파일을 보고 ORM시스템이 sql 문으로 돌려 싱크를 맞춘다.

 

 

//app.js
const config = global.config;
const redis = require('redis');
const session = require('express-session');
const RedisStore = require('connect-redis')(session);
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const routes = require('../routes');
const app = require('express');
let redisClient;


redisClient = redis.createClient(
[PORT NUMBER], 
[HOST(example:username.redis.cache.windows.net)],
{
auth_pass : [ACCESS_KEY], 
tls:{
servername: [HOST(example:username.redis.cache.windows.net)]
}
});
redisClient.on('connect', () => console.log('Redis connected'));
redisClient.on('error', err => {
console.log(err.message);
redisClient.end(true);
process.exit(1);
});


 app.use(session({
      cookie: {maxAge: config.sessionCookie.timeout},
      resave: true,
      saveUninitialized: true,
      secret: config.sessionSecret,
      store: new RedisStore({client: redisClient})
    }));

 

이로써 세션 저장소는 cache for Redis(Azure) 에 저장이 되고 Sequelize를 사용하여 MS-SQL과 node.js연결이 끝났다. 

 

//routes/login.js

const express = require('express');
const router = express.Router();
const models = require('../models')

router.route(`/`)
    .get(function (req, res) {
        res.render('login');
    });

router.route(`/`)
    .post(function (req, res) {
        const username = req.body.username;
        const password = req.body.password;

        const a = models.employee.findAll({//모델 임플로이에서 찾는다.
            where: { 				//무엇을?
                username: username //유저네임이  body로 들어온 유저네임인 데이터를
            },
            attributes: ['id', 'username', 'password'] // 어떤 형식을 뽑아 올건지
        }).then(user => {                              //쿼리문의 결과는 user로 저장되고
            if (user[0].password == password) {
	            req.session.user = {
                username: req.body.username,
                auth: true
            };
                res.cookie('auth', true).redirect('/');
            } else {
                console.log('check id/password')
                res.redirect('/login');
            }
        })
    });
 //위의 쿼리문을 써보면 SELECT username, password FROM WHERE username = req.body.username;이 되는 것이다.

module.exports = router;

 

 

 

 

//routes/signup.js

const express = require('express');
const router = express.Router();
const models = require('../models')
const regexPW = new RegExp("^(((?=.*[a-z])(?=.*[A-Z]))|((?=.*[a-z])(?=.*[0-9]))|((?=.*[A-Z])(?=.*[0-9])))(?=.{6,})"); // 6 character or longer/ lower case at least 1 / capital case at least 1

router.route(`/`)
    .get(function (req, res) {
        res.render('signup');
    });

router.route(`/`)
    .post(function (req, res) {
        if (!regexPW.test(req.body.password)) return res.send('password problem')
      
        const a = models.employee.findAll({
            where:{
                username:req.body.username
            },
            attributes:['id','username']
        }).then(employee => {
            if(employee.length==1){
                res.send('Already registered username')
        }else{
            req.session.user = {
                username: req.body.username,
                auth: true
            };
            return models.employee.create({
                first_name: req.body.first_name,
                last_name: req.body.last_name,
                phone_number: req.body.phone_number,
                username: req.body.username,
                password: req.body.password
            }).then(function (employee) {
                if (employee) {
                    res.cookie('auth', true).redirect('/');
                } else {
                    res.status(400).send('Error in insert new record');
                }
            });
        }
        })
    });

module.exports = router;

 

대충 이런식이다. 그냥 플로우를 보고 싶어서 만들었기 때문에 그대로 사용하면 큰일 납니다.

반응형