반응형
설치 해야 하는 것
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;
대충 이런식이다. 그냥 플로우를 보고 싶어서 만들었기 때문에 그대로 사용하면 큰일 납니다.
반응형
'Framework > Node.js' 카테고리의 다른 글
Node.js - TinyMCE WYSIWYG 에디터 Image를 클라우드에 Upload하기(feat. Azure storage) (0) | 2021.05.22 |
---|---|
Node.js - query INSERT INTO [table] (column) values 넣기 (0) | 2021.05.12 |
노드.제이에스 기본 내장 함수 Node.js Fundamental (0) | 2021.04.30 |