터미널
npm i node?
npm i express
npm i ejs
npm install express-mysql-session --save
npm install express-session --save
(npx) pm2 start app.js --watch
서버실행: --watch는 무한실행
pm2 kill
전체 서버파일 중지
pm2 list
실행되고 있는 서버파일 확인
pm2 monit
실행되고있는 서버파일 모니터링
pm2 log
로그만 위로 쭉 볼 수 있게 (monit는 짧게 보이니까)
ejs, session 포함
//[기본]app변수로 express구동 [기본]
const express = require('express');
const app = express();
//[기본]라우터경로
const router=require('./router/router.js');
//[기본]바디파서
const bodyparser = require('body-parser');
// (ejs) ejs
let ejs = require('ejs'); // 이 코드에서는 이 ejs변수는 쓰지 않는다 아래 "ejs"는 문자가 아니라 set의 기능이다
// (ejs) ejs 파일을 view폴더에 // app.use는우리가만들어서스는 것 set은 이미 잇는 속성/기능
app.set('view engine', "ejs");
// {session}
let conn = {
host: '127.0.0.1',
user: 'cshuser',
password: 'cshpass',
port: '3306',
database: 'nodejs_db'}
const mysql_session = require('express-mysql-session')
let conn_session = new mysql_session(conn);
const session = require('express-session')
app.use(session({ //미들웨어로 세션기능 (저장위치:mysql)등록?
secret : 'smart',
resave : false, // 매번서버에저장을할건지
saveUninitialized : true, //서버를시작할때세션을초기화를할건지
store : conn_session}))
//[기본]바디파서를 포스트로 쓰겠다
app.use(bodyparser.urlencoded({extended:false})) // app use router 위에와야함
//[기본]라우터구동
app.use(router); //미들웨어로 라우터를 등록해주기
//[기본]포트설정 127.0.0.1.3001
app.listen(3001); // 현재 서버파일의 port번호설정
//?
//app.use(express.static('./public'))
const mysql = require('mysql');
//특정데이터베이스지정 // sql아이디비번
let conn = mysql.createConnection({
host: '127.0.0.1',
user: 'cshuser',
password: 'cshpass',
port: '3306',
database: 'nodejs_db'
})
module.exports=conn
const express = require('express');
const router = express.Router();
const conn = require('../config/DBConfig.js')
// 0 메인페이지 http://127.0.0.1:3001/Main
router.get('/main', (request, response) => {
response.redirect('http://127.0.0.1:5500/public/00.Main.html')
});
//1 넘버 2개 더하기
router.get('/plus', function (request, response) { // /plus라우터 기능정의및등록
/* /plus객체가가진 req res
c 가보낸정보 req에잇다
res > html 을 c 에게 응답 */
console.log(request.query.num1);
console.log(request.query.num2);
//200은정상응답이란뜻 html로응답
response.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });
response.write('<html>')
response.write('<body>')
response.write('<h1>응답성공</h1>')
response.write('결과값' + (parseInt(request.query.num1) + parseInt(request.query.num2)))
response.write('</body>')
response.write('</html>')
response.end();
});
// 2 넘버2개 사칙연산
router.get('/cal', function (request, response) { // /plus라우터 기능정의및등록
let num1 = request.query.num1;
let cal = request.query.cal;
let num2 = request.query.num2;
console.log(num1, cal, num2);
/* /plus객체가가진 req res
c 가보낸정보 req에잇다
res > html 을 c 에게 응답 */
//200은정상응답이란뜻 html로응답
response.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });
response.write('<html>')
response.write('<body>')
response.write('<h1>응답성공</h1>')
/* 긴 if else if 코드
if (cal == '+') {
response.write('결과값' + (parseInt(num1) + parseInt(num2)))
} else if (cal == '-') {
response.write('결과값' + (parseInt(num1) - parseInt(num2)))
} else if (cal == '*') {
response.write('결과값' + (parseInt(num1) * parseInt(num2)))
} else if (cal == '/') {
response.write('결과값' + (parseInt(num1) / parseInt(num2)))
} */
//eval 함수로 cal을 연산 기호로 바꿔서 코드를 줄임
response.write('결과값' + eval(parseInt(num1) + cal + parseInt(num2)))
response.write('</body>')
response.write('</html>')
response.end();
});
// 3 시험성적 입력 받고 그레이드와 평균 출력
router.post('/grade', function (request, response) {
response.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });
response.write('<html>')
response.write('<body>')
response.write('<h1>응답성공</h1>')
let name = request.body.name
let java = request.body.java
let web = request.body.web
let iot = request.body.iot
let android = request.body.android
let avg = (parseInt(java) + parseInt(web) + parseInt(iot) + parseInt(android)) / 4
//리스폰스라이트안에서는 하나의 값만 써야하기 때문에 , 대신 +를 써야 한다.
response.write(name + '님의' + ' avg는 ' + avg + '이고 ')
if (avg <= 75 && avg >= 0) {
response.write('grade는 F')
} else if (avg <= 79) {
response.write('grade는 c')
} else if (avg <= 84) {
response.write('grade는 b')
} else if (avg <= 89) {
response.write('grade는 b+')
} else if (avg <= 94) {
response.write('grade는 a')
} else if (avg <= 100) {
response.write('grade는 a+')
}
response.write('입니다')
response.write('</body>')
response.write('</html>')
response.end();
});
//4 회원가입페이지 정보 받고 데이터만 출력
router.post('/join', (request, response) => {
response.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });
response.write('<html>')
response.write('<body>')
response.write('<h1>응답성공1</h1>')
response.write('id: ' + request.body.id + '<br>')
response.write('name: ' + request.body.name + '<br>')
response.write('email: ' + request.body.email + '<br>')
response.write('tel: ' + request.body.tel + '<br>')
response.write('gender: ' + request.body.gender + '<br>')
response.write('country: ' + request.body.country + '<br>')
response.write('birth: ' + request.body.birth + '<br>')
response.write('color: ' + request.body.color + '<br>')
response.write('hobby: ' + request.body.hobby + '<br>')
response.write('talk: ' + request.body.talk + '<br>')
response.write('<h1>응답성공4</h1>')
response.write('</body>')
response.write('</html>')
response.end();
});
// 5 특정아이디비번 로긴 성공 실패
router.post('/login', (request, response) => {
let id = request.body.id
let pw = request.body.pw
if (id == 'a' && pw == 'a') {
response.redirect('http://127.0.0.1:5500/public/05.2.LoginS.html')
//html파일에서 우클릭 오픈위드라이브서버 로 페스확인
} else {
response.redirect('http://127.0.0.1:5500/public/05.3.LoginF.html')
}
});
// 6 db 회원삭제 //아래부터는DB활용
router.get('/deleteDB', (request, response) => {
let id = request.query.id
let sql = "DELETE FROM member WHERE id=?";
// 어떤sql? + 실패햇을떄와성공했을떄함수
conn.query(sql, [id], (err, row) => { //[id,pw,nick]는물음표순서대로그대로
if (err) {
console.log('에러,삭제실패' + err)
}
else if (row.affectedRows > 0) {//에러가없으면 //어펙티드로우스는 명령 성공 횟수
console.log('명령에성공한수:' + row.affectedRows);
console.log('삭제성공' + row)
console.log(row)
console.log(row.affectedRows)
console.log(row.length)
response.redirect('http://127.0.0.1:5500/public/06.2.DeleteS.html');
} else if (row.affectedRows == 0) {
console.log('삭제된값없음')
response.redirect('http://127.0.0.1:5500/public/06.3.DeleteF.html');
}
})
});
//7 db 회원가입 (가입성공하면 메인페이지로 이동)
router.post('/joinDB', (request, response) => {
let id = request.body.id
let pw = request.body.pw
let nick = request.body.nick;
//let sql="insert into member values('1','1','1')";
//유저가보낸걸넣기 []을추가
let sql = "insert into member values(?,?,?)";
// 어떤sql? + 실패햇을떄와성공했을떄함수
conn.query(sql, [id, pw, nick], (err, row) => { //[id,pw,nick]는물음표순서대로그대로
if (!err) {//에러가없으면
console.log('입력성공' + row)
response.redirect('http://127.0.0.1:5500/public/07.2.JoinDBS.html');
} else {
console.log('입력실패' + err)
response.redirect('http://127.0.0.1:5500/public/07.3.JoinDBF.html');
}
})
});
// 8. db 회원수정
router.post('/updateDB', (request, response) => {
let select = request.body.select
let sql = `
UPDATE member
SET ${select}=?
WHERE id=?;
`;
let change = request.body.change
let id = request.body.id
conn.query(sql, [change, id], (err, row) => { //[id,pw,nick]는물음표순서대로그대로
if (!err) {//에러가없으면
console.log('수정성공' + row)
response.redirect('http://127.0.0.1:5500/public/08.2.UpdateDBS.html');
} else {
console.log('수정실패' + err)
console.log(select, change, id)
response.redirect('http://127.0.0.1:5500/public/08.3.UpdateDBF.html');
}
})
});
// 9. db ejs 특정 회원 1명 찾기 (09.2.SearchOneDBS는 ejs로)
router.get('/searchOneDB', (request, response) => {
let id = request.query.id
let sql = `
select *
from member
WHERE id=?
`;
conn.query(sql, [id], (err, row) => { //[id,pw,nick]는물음표순서대로그대로
console.log(row)
if (err) {
console.log('검색실패에러' + err)
response.redirect('http://127.0.0.1:5500/public/09.3.SearchOneDBF.html')
}
else if (row.length > 0) {//에러가없고 검색값이 있으면
//selectOne.ejs 부르고 ejs가 출력 그리고 검색값을 row_name변수로 넘겨줌
console.log('검색성공 검색값 있음')
response.render('SearchOneDBS', {
row_name: row
})
} else if (row.length == 0) {
console.log('검색값없음')
response.redirect('http://127.0.0.1:5500/public/09.4.SearchOneDBN.html')
}
})
});
// 10. db 로그인 db에아이디패스워드있는지확인
router.post('/loginDB', (request, response) => {
let id = request.body.id
let pw = request.body.pw
console.log(id, pw)
let sql = `
select *
from member
WHERE id=? and pw=?
`;
conn.query(sql, [id, pw], (err, row) => { //[id,pw,nick]는물음표순서대로그대로
if (err) {
console.log('검색실페에러' + err)
} else if (row.length > 0) {
console.log('로긴성공')
response.redirect('http://127.0.0.1:5500/public/05.2.LoginS.html')
/* request.session.user = id; //로긴에성공한사람의아이디
console.log('session영역에아이디저장성공' + request.session.user);
response.render('LoginS', {
row_name: row
}) */
} else if (row.length == 0) {
console.log('로긴실패')
response.redirect('http://127.0.0.1:5500/public/05.3.LoginF.html')
}
})
});
// 11. db 전체검색 검색되는지확인, html에서 포스트로 보낸다는 표현이 없으면 무조건 get으로 받는다 post는 post로 보낸다는 코드가 잇어야 사용 가능
router.get('/searchAllDB', (request, response) => {
let sql = `
select * from member
`;
console.log(sql)
conn.query(sql, (err, row) => { //[id,pw,nick]는물음표순서대로그대로
//row에 셀렉트로 불러온 값
//row[0]이면 첫행 한 줄 row[0].id면 아이디 하나
if (err) {
console.log('에러' + err)
} else if (row.length >= 1) {
console.log('검색성공 :' + row.length + ' 명')
console.log(row)
response.redirect('http://127.0.0.1:5500/public/11.2.searchAllDBS.html')
} else {
console.log('검색햇으나 회원이 0명 row.length는 : ' + row.length)
response.redirect('http://127.0.0.1:5500/public/11.3.searchAllDBF.html')
}
})
});
// 12. db ejs 로그인
router.post('/loginDBejs', (request, response) => {
let id = request.body.id
let pw = request.body.pw
//console.log(id,pw)
request.session.user = id //로긴에성공한사람의아이디를 세션에 저장,conn.문안에적어도괜찮
let sql = `
select *
from member
WHERE id=? and pw=?
`;
conn.query(sql, [id, pw], (err, row) => { //[id,pw,nick]는물음표순서대로그대로
if (err) {
console.log('검색실페에러' + err)
} else if (row.length > 0) {
console.log('로긴성공')
//response.redirect('http://127.0.0.1:5500/public/05.2.LoginS.html')
console.log('session영역에아이디저장성공 저장아이디는: ' + request.session.user);
console.log(row)
console.log('row[0].id: ' + row[0].id)
response.render('loginDBejs', {
row_name: row
})
} else if (row.length == 0) {
console.log('로긴실패')
response.redirect('http://127.0.0.1:5500/public/05.3.LoginF.html')
}
})
});
// 13. db ejs 전체검색 전체회원리스트까지 출력, html에서 포스트로 보낸다는 표현이 없으면 무조건 get으로 받는다 post는 post로 보낸다는 코드가 잇어야 사용 가능
router.get('/searchAllDBejs', (request, response) => {
let sql = `
select * from member
`;
conn.query(sql, (err, row) => { //[id,pw,nick]는물음표순서대로그대로
//row에 셀렉트로 불러온 값, row[0]이면 첫행 한 줄, row[0].id면 아이디 하나
if (err) {
console.log('에러' + err)
response.redirect('http://127.0.0.1:5500/public/11.3.searchAllDBF.html')
} else if (row.length >= 1) {
console.log('검색성공 :' + row.length + ' 명')
console.log(row)
//selectOne.ejs 부르고 ejs가 출력
response.render('searchAllDBejs', {
row_names: row
})
} else {
console.log('검색햇으나 회원이 0명 ' + row.length)
response.redirect('http://127.0.0.1:5500/public/11.4.searchAllDBN.html')
}
})
});
// 13-2. db 13번 전체검색에서 테이블에서 바로 삭제를 하기 위한 라우터
router.get('/SelectDelete', (request, response) => {
let id = request.query.id
let sql = "DELETE FROM member WHERE id=?";
// 어떤sql? + 실패햇을떄와성공했을떄함수
conn.query(sql, [id], (err, row) => { //[id,pw,nick]는물음표순서대로그대로
if (err) {
console.log('삭제실패' + err)
}
else if (row.affectedRows > 0) {//에러가없으면
console.log('명령에성공한수:' + row.affectedRows);
console.log('삭제성공' + row)
response.redirect('http://127.0.0.1:3001/searchAllDBejs');
} else if (row.affectedRows == 0) {
console.log('삭제된값없음')
response.redirect('http://127.0.0.1:3001/main');
}
})
});
//session
//// id: request.session.user 로 이 라우터로 들어올때 id값을 받는다 이 값으로 MainEJS.ejs에서 사용
// 14 db ejs session 메인EJS 페이지
router.get('/MainEJS', (request, response) => {
response.render('MainEJS',{
id: request.session.user
})
});
//session
// 14-2 MainEJS페이지에서 로그아웃 버튼을 누르면 이 라우터로 오고
// delete 리퀘스트로세션으로 id 값을 지우고 다시 메인ejs페이지로 보냄
router.get('/Logout', (request, response) => {
delete request.session.user;
response.render('MainEJS', {
id: request.session.user
})
});
module.exports = router; //라우터를외부에서사용할수있게
//ejs에서
/* router.get('/Message', (request,response)=>{
response.render('message',{});
}) */
form 태그로 /plus 라우터로 겟 방식으로 보낸다
(숫자1 숫자2 보냄)
html의 form태그: 보내는 방향과 방법을 지정
<form action="http://127.0.01:3001/plus" method="get">
<input type="text" name="num1">
<input type="text" name="num2">
<input type="submit" value="더하기" >
</form>
겟은 url로 보내고 쿼리로 받고
포스트는 패킷으로 보내고 바디로 받는다
/plus 라우터에서 마찬가지로 겟으로 받고 겟 > url > 쿼리로
네임의 밸류 값으로 받는다
문자인 인풋 값을 팔스인트로 숫자로 바꾸고 플러스 값을
http://127.0.01:3001/plus 에서 그대로 출력한다
router.get('/plus', function (request, response) { // /plus라우터 기능정의및등록
/* /plus객체가가진 req res
c 가보낸정보 req에잇다
res > html 을 c 에게 응답 */
console.log(request.query.num1);
console.log(request.query.num2);
//200은정상응답이란뜻 html로응답
response.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });
response.write('<html>')
response.write('<body>')
response.write('<h1>응답성공</h1>')
response.write('결과값' + (parseInt(request.query.num1) + parseInt(request.query.num2)))
response.write('</body>')
response.write('</html>')
response.end();
});
<form action="http://127.0.01:3001/cal" method="get">
<input type="text" name="num1">
<select name="cal">
<option>+</option>
<option>-</option>
<option>*</option>
<option>/</option>
</select>
<input type="text" name="num2">
<input type="submit" value="더하기">
<!-- html에서 서버로 값을 보내기 위한 세가지 조건
1. form 태그 action속성(보내는방향지정)
2. 사용자가입력하는 태그에 name속성 (이름표)
3. input 태그의 tpye=submit 버튼 속성 -->
</form>
router.get('/cal', function (request, response) { // /plus라우터 기능정의및등록
/* /plus객체가가진 req res
c 가보낸정보 req에잇다
res > html 을 c 에게 응답 */
let num1 = request.query.num1;
let cal = request.query.cal;
let num2 = request.query.num2;
console.log(num1, cal, num2);
//200은정상응답이란뜻 html로응답
response.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });
response.write('<html>')
response.write('<body>')
response.write('<h1>응답성공</h1>')
/* 긴 if else if 코드
if (cal == '+') {
response.write('결과값' + (parseInt(num1) + parseInt(num2)))
} else if (cal == '-') {
response.write('결과값' + (parseInt(num1) - parseInt(num2)))
} else if (cal == '*') {
response.write('결과값' + (parseInt(num1) * parseInt(num2)))
} else if (cal == '/') {
response.write('결과값' + (parseInt(num1) / parseInt(num2)))
} */
//eval 함수로 cal을 연산 기호로 바꿔서 코드를 줄임
response.write('결과값' + eval(parseInt(num1) + cal + parseInt(num2)))
response.write('</body>')
response.write('</html>')
response.end();
});
<form action="http://127.0.0.1:3001/grade" method="post">
<fieldset>
<legend>성적확인프로그램</legend>
<table width="500">
<tr>
<td>이름</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td>JAVA점수</td>
<td><input type="text" name="java"></td>
</tr>
<tr>
<td>WEB점수</td>
<td><input type="text" name="web"></td>
</tr>
<tr>
<td>IOT점수</td>
<td><input type="text" name="iot"></td>
</tr>
<tr>
<td>ANDROID점수</td>
<td><input type="text" name="android"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="확인하기!"></td>
</tr>
</table>
</fieldset>
</form>
router.post('/grade', function (request, response) {
response.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });
response.write('<html>')
response.write('<body>')
response.write('<h1>응답성공</h1>')
let name = request.body.name
let java = request.body.java
let web = request.body.web
let iot = request.body.iot
let android = request.body.android
let avg = (parseInt(java) + parseInt(web) + parseInt(iot) + parseInt(android))/4
//리스폰스라이트안에서는 하나의 값만 써야하기 때문에 , 대신 +를 써야 한다.
response.write(name + '님의' + ' avg는 ' + avg + '이고 ')
if (avg <= 75 && avg >= 0) {
response.write('grade는 F')
} else if (avg <= 79) {
response.write('grade는 c')
} else if (avg <= 84) {
response.write('grade는 b')
} else if (avg <= 89) {
response.write('grade는 b+')
} else if (avg <= 94) {
response.write('grade는 a')
} else if (avg <= 100) {
response.write('grade는 a+')
}
response.write('입니다')
response.write('</body>')
response.write('</html>')
response.end();
});
<form action="http://127.0.0.1:3001/join" method="post">
<fieldset>
<legend>Join Page</legend>
<table align="center">
<tr>
<td><label for="id">ID</label></td>
<td><input type="text" name="id" id="id"></td>
</tr>
<tr>
<td><label for="pw">PW</label></td>
<td><input type="password" name="pw" id='pw'></td>
</tr>
<tr>
<td><label for="name">NAME</label></td>
<td><input type="text" name="name" id="name"></td>
</tr>
<tr>
<td><label for="email">EMAIL</label></td>
<td><input type="email" name="email" id="email"></td>
</tr>
<tr>
<td><label for="tel">TEL</label></td>
<td><input type="tel" name="tel" id="tel"></td>
</tr>
<tr>
<td><label for="gender">GENDER</label></td>
<td>MAN<input type="radio" name="gender" value="Man" id="gender">
WOMEN<input type="radio" name="gender" value="Women" id="gender"></td>
</tr>
<tr>
<td><label for="hobby">HOBBY</label></td>
<td>SPORT<input type="checkbox" name='hoppy' id="hoppy" value="sport">
STUDY<input type="checkbox" name='hoppy' id="hobby" value="study">
EATING<input type="checkbox" name='hoppy' id="hobby" value="eating"></td>
</tr>
<tr>
<td><label for="birth">BIRTHDAY</label></td>
<td><input type="date" name="birth" id="birth"></td>
</tr>
<tr>
<td><label for="color">COLOR</label></td>
<td><input type="color" name="color" id="color"></td>
</tr>
<tr>
<td><label for="country">COUNTRY</label></td>
<td><select name="country" >
<option>choice..</option>
<option>KOREA</option>
<option>USA</option>
</select>
</td>
</tr>
<tr>
<td><label for="talk">TALK</label></td>
<td><textarea id='talk' name="talk" rows="10" cols="30"></textarea>
</td>
</tr>
<tr align="center">
<td colspan="2"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="확인하기!"></td>
</tr>
</table>
</fieldset>
</form>
get
은 url로 보내고
url?key:value&key:value&key:valu // ?쿼리스트링
request.query.name 으로 받는다
post
는 패킷으로 보내고
request.body.name 으로 받는다
response.write('<html') 가 있으면 그 밖에서 request.query.name
으로 받아야만 한다
a. response.write('<body') 가 있는 경우 이 html문
안에서 request.body.name 바디로 받아야만 한다.
b. 최상단에
request.body.name를 위치시킬 경우 아래
response.write
가 있으면 에러가 나고
c. 아래 response.write 없으면 계속 기다린다
d. 최상단 request.body.name 아래
response.redirect( 가 아래 있는 경우 정상적으로 값을
받으면서 리다이렉트 주소로 넘어간다.
06.Delete.html 파일에서 아이디 인풋 후 회원 삭제를 누르면
/delete 라우트로 보낸다
<!-- 06 부터는 db 활용 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>[DB] 회원삭제페이지</h1>
<form action="http://127.0.0.1:3001/delete" method="get">
<input type="text" name="id">
<input type="submit" value="회원삭제">
</form>
</body>
</html>
/delete 라우트에서 삭제에 성공하면 리다이렉트로 이동하여
<body>
삭제성공
</body>
을 띄운다
router.get('/delete', (request, response) => {
let id = request.query.id
let sql = "DELETE FROM member WHERE id=?";
// 어떤sql? + 실패햇을떄와성공했을떄함수
conn.query(sql, [id], (err, row) => { //[id,pw,nick]는물음표순서대로그대로
if (err) {
console.log('에러,삭제실패' + err)
}
else if (row.affectedRows > 0) {//에러가없으면 //어펙티드로우스는 명령 성공 횟수
console.log('명령에성공한수:' + row.affectedRows);
console.log('삭제성공' + row)
response.redirect('http://127.0.0.1:5500/public/06.2.DeleteS.html');
} else if (row.affectedRows == 0) {
console.log('삭제된값없음')
response.redirect('http://127.0.0.1:5500/public/06.3.DeleteF.html');
}
})
});
console.log(row) 의 모양을 보고 코드를 작성한다
(console.log('str'+row) 면 row가 오브젝트로만 나옴)
row.length
row[i].id
딜리트의 경우 row 오브젝트에 affectedRows 를 키로하는 값등 여러
값이이 담긴다. affectedRows는 명령이 성공한 횟수
row.affectedRows로 사용
07.JoinDB.html 에서 인풋을 받고 회원가입 버튼을 누르면
/JoinDB 라우터로 인풋값과 함께 보낸다
<form action="http://127.0.0.1:3001/JoinDB" method="post">
<table>
<tr>
<td>id</td>
<td><input type="text" name="id"></td>
</tr>
<tr>
<td>pw</td>
<td><input type="password" name="pw"></td>
</tr>
<tr>
<td>nick</td>
<td><input type="text" name="nick"></td>
</tr>
</table>
<br>
<input type="submit" value="회원가입"><br>
</form>
/joinDB 라우터에서는
받은 인풋값으로 sql db 테이블에 추가를 하고
성공하면 리다이렉트로 url을 이동하여
<body>
가입성공
</body>
을 띄운다
07.2.JoinDBS.html 파일의 open with live server 주소값
response.redirect('http://127.0.0.1:5500/public/07.2.JoinDBS.html');
router.post('/joinDB', (request, response) => {
let id = request.body.id
let pw = request.body.pw
let nick = request.body.nick;
//let sql="insert into member values('1','1','1')";
//유저가보낸걸넣기 []을추가
let sql = "insert into member values(?,?,?)";
// 어떤sql? + 실패햇을떄와성공했을떄함수
conn.query(sql, [id, pw, nick], (err, row) => { //[id,pw,nick]는물음표순서대로그대로
if (!err) {//에러가없으면
console.log('입력성공' + row)
response.redirect('http://127.0.0.1:5500/public/07.2.JoinDBS.html');
} else {
console.log('입력실패' + err)
response.redirect('http://127.0.0.1:5500/public/07.3.JoinDBF.html');
}
})
});
08.UpdateDB.html에서 수정을 누르면
/updateDB 라우터로 보낸다
<form action="http://127.0.0.1:3001/updateDB" method="post">
<table>
<tr>
<td>
id 의
</td>
<td>
<input type="text" name="id">
</td>
</tr>
<tr>
<td>
pw/nick 을
</td>
<td>
<select name="select">
<option>pw</option>
<option>nick</option>
</select>
</td>
</tr>
<tr>
<td>
value 로
</td>
<td>
<input type="text" name="change">
</td>
</tr>
</table>
<br>
<input type="submit" value="수정">
</form>
/updateDB라우터에서는 sql로 수정을 하고 리다이렉트로
<body>
수정성공
</body>
띄운다
router.post('/updateDB', (request, response) => {
let select = request.body.select
let sql = `
UPDATE member
SET ${select}=?
WHERE id=?;
`;
let change = request.body.change
let id = request.body.id
conn.query(sql, [change, id], (err, row) => { //[id,pw,nick]는물음표순서대로그대로
if (!err) {//에러가없으면
console.log('수정성공' + row)
response.redirect('http://127.0.0.1:5500/public/08.2.UpdateDBS.html');
} else {
console.log('수정실패' + err)
console.log(select, change, id)
response.redirect('http://127.0.0.1:5500/public/08.3.UpdateDBF.html');
}
})
});
09.SearchOneDB.html 에서 아이디를 인풋 받고 /SearchOneDB 라우터로
보낸다
<form action="http://127.0.0.1:3001/SearchOneDB" method="get">
<input type="text" name="id">
<input type="submit" value="회원id로 검색">
</form>
/SearchOneDB라우터에서는 sql로 아이디를 select하고 검색값이
있다면 라우터를 유지하고 렌더로 SearchOneDBS.ejs 파일을 렌더링한다
router.get('/searchOneDB', (request, response) => {
let id = request.query.id
let sql = `
select *
from member
WHERE id=?
`;
conn.query(sql, [id], (err, row) => { //[id,pw,nick]는물음표순서대로그대로
console.log(row)
if (err) {
console.log('검색실패에러' + err)
response.redirect('http://127.0.0.1:5500/public/09.3.SearchOneDBF.html')
}
else if (row.length > 0) {//에러가없고 검색값이 있으면
//selectOne.ejs 부르고 ejs가 출력 그리고 검색값을 row_name변수로 넘겨줌
console.log('검색성공 검색값 있음')
response.render('SearchOneDBS', {
row_name: row
})
} else if (row.length == 0) {
console.log('검색값없음')
response.redirect('http://127.0.0.1:5500/public/09.4.SearchOneDBN.html')
}
})
});
SearchOneDBS.ejs파일
1명 검색이니까 0인덱으로 키가 id인 것의 value 즉 ~아이디
~비번
~닉 도 출력한다
<table border="3px;">
<tr>
<th>id</th>
<th>pw</th>
<th>nick</th>
</tr>
<tr>
<td>
<%=row_name[0].id%>
</td>
<td>
<%=row_name[0].pw%>
</td>
<td>
<%=row_name[0].nick%>
</td>
</tr>
</table>
//app변수로 express구동
const express = require('express');
const app = express();
//라우터경로
const router=require('./router/router.js');
//바디파서
const bodyparser = require('body-parser');
// ejs
let ejs = require('ejs');
// ejs 파일을 view폴더에 // app.use는우리가만들어서스는 것 set은 이미 잇는 속성/기능
app.set('view engine', "ejs");
//바디파서를 포스트로 쓰겠다
app.use(bodyparser.urlencoded({extended:false})) // app use router 위에와야함
//라우터구동
app.use(router); //미들웨어로 라우터를 등록해주기
//포트설정 127.0.0.1.3001
app.listen(3001); // 현재 서버파일의 port번호설정
SearchOneDBS.ejs지정
response.render('SearchOneDBS', {
row_name: row
})
여기서
렌더SearchOneDBS 여기랑 SearchOneDBS.ejs 대소문자는 구분 안함
main.html에서
<a href='http://127.0.0.1:3001/searchAllDBejs'>
<button> 13. [DB][ejs] 모든회원검색 </button>
</a>
폼태그 없이 겟/포스트 방식을 지정하지 않고 버튼으로 searhAllDBejs
라우터로 보낸다
라우터.js에서는
router.get('/searchAllDBejs', (request, response) => {
로 받는다
방식을 지정하지 않고 받을 땐 무조건 get으로 받는다
post는 post라고 지정해줘야 받을 수 있다
/searchAllDBejs 라우트에서는 라우트는 유지하고
searchAllDBejs.ejs 로 렌더링을 한다
row_names: row 로 row에 담긴 것을 row_names로
searchAllDBejs.ejs 로 보낸다
router.get('/searchAllDBejs', (request, response) => {
let sql = `
select * from member
`;
conn.query(sql, (err, row) => { //[id,pw,nick]는물음표순서대로그대로
//row에 셀렉트로 불러온 값, row[0]이면 첫행 한 줄, row[0].id면 아이디 하나
if (err) {
console.log('에러' + err)
} else if (row.length >= 1) {
console.log('검색성공 :' + row.length + ' 명')
console.log(row)
//selectOne.ejs 부르고 ejs가 출력
response.render('searchAllDBejs', {
row_names: row
})
} else {
console.log('검색햇으나 회원이 0명 ' + row.length)
}
})
});
searchAllDBejs.ejs 파일
받은 row_names로 ejs문법 포문으로 회원리스트를 출력하고
삭제버튼을 누르면 /SelectDelete 라우트로 쿼리로 아이디를 보낸다
<table border="3px;">
<tr>
<th>id</th>
<th>pw</th>
<th>nick</th>
</tr> <!-- i 0부터시작하니까 렝스보다 작다로 -->
<% for (let i=0; i < row_names.length; i++){%>
<tr>
<td>
<%= row_names[i].id %>
</td>
<td>
<%= row_names[i].pw %>
</td>
<td>
<%= row_names[i].nick %>
</td>
<td>
<a href="http://127.0.0.1:3001/SelectDelete?id=<%= row_names[i].id %>">삭제</a>
</td>
</tr>
<%}%>
</table>
/SelectDelete 라우트에서 쿼리로 아이디를 받고 sql문으로
아이디가 존재하면 삭제한다
삭제에 성공하면 /searchAllDBejs 라우트로 보낸다
router.get('/SelectDelete', (request, response) => {
let id = request.query.id
let sql = "DELETE FROM member WHERE id=?";
// 어떤sql? + 실패햇을떄와성공했을떄함수
conn.query(sql, [id], (err, row) => { //[id,pw,nick]는물음표순서대로그대로
if (err) {
console.log('삭제실패' + err)
}
else if (row.affectedRows > 0) {//에러가없으면
console.log('명령에성공한수:' + row.affectedRows);
console.log('삭제성공' + row)
response.redirect('http://127.0.0.1:3001/searchAllDBejs');
} else if (row.affectedRows == 0) {
console.log('삭제된값없음')
response.redirect('http://127.0.0.1:3001/main');
}
})
});
/searchAllDBejs에서
회원검색이 성공하면 라우트를 유지하고
searchAllDBejs.ejs를 렌더링한다
router.get('/searchAllDBejs', (request, response) => {
let sql = `
select * from member
`;
conn.query(sql, (err, row) => { //[id,pw,nick]는물음표순서대로그대로
//row에 셀렉트로 불러온 값, row[0]이면 첫행 한 줄, row[0].id면 아이디 하나
if (err) {
console.log('에러' + err)
response.redirect('http://127.0.0.1:5500/public/11.3.searchAllDBF.html')
} else if (row.length >= 1) {
console.log('검색성공 :' + row.length + ' 명')
console.log(row)
//selectOne.ejs 부르고 ejs가 출력
response.render('searchAllDBejs', {
row_names: row
})
} else {
console.log('검색햇으나 회원이 0명 ' + row.length)
response.redirect('http://127.0.0.1:5500/public/11.4.searchAllDBN.html')
}
})
});
searchAllDBejs.ejs 에서 다시 회원리스트를 출력하여
처음 삭제 버튼을 누를 때 삭제한 회원만 삭제되고 바로 리스트는 유지되는
것처럼 보이게 한다
<table border="3px;">
<tr>
<th>id</th>
<th>pw</th>
<th>nick</th>
</tr> <!-- i 0부터시작하니까 렝스보다 작다로 -->
<% for (let i=0; i < row_names.length; i++){%>
<tr>
<td>
<%= row_names[i].id %>
</td>
<td>
<%= row_names[i].pw %>
</td>
<td>
<%= row_names[i].nick %>
</td>
<td>
<a href="http://127.0.0.1:3001/SelectDelete?id=<%= row_names[i].id %>">삭제</a>
</td>
</tr>
<%}%>
</table>
12.loginDBejs.html파일에서 로그인을 하면
/loginDBejs 라우트로 보낸다
<form action="http://127.0.0.1:3001/loginDBejs" method="post">
<!-- password 포스트방식보안 -->
<input type="text" name="id"><br>
<input type="password" name="pw"><br><br>
<input type="submit" value="로그인"><br>
</form>
/loginDBejs 라우트에서 로그인에 성공하면 라우트를 유지하고
loginDBejs.ejs를 렌더링한다
router.post('/loginDBejs', (request, response) => {
let id = request.body.id
let pw = request.body.pw
//console.log(id,pw)
request.session.user = id //로긴에성공한사람의아이디를 세션에 저장,conn.문안에적어도괜찮
let sql = `
select *
from member
WHERE id=? and pw=?
`;
conn.query(sql, [id, pw], (err, row) => { //[id,pw,nick]는물음표순서대로그대로
if (err) {
console.log('검색실페에러' + err)
} else if (row.length > 0) {
console.log('로긴성공')
//response.redirect('http://127.0.0.1:5500/public/05.2.LoginS.html')
console.log('session영역에아이디저장성공 저장아이디는: ' + request.session.user);
console.log(row)
console.log('row[0].id: ' + row[0].id)
response.render('loginDBejs', {
row_name: row
})
} else if (row.length == 0) {
console.log('로긴실패')
response.redirect('http://127.0.0.1:5500/public/05.3.LoginF.html')
}
})
});
loginDBejs.ejs 파일
<%=row_name[0].id%>님 로그인 하셨습니다<br><br>
<a href="http://127.0.0.1:3001/MainEJS">메인ejs로 이동</a>
<br><br>
<button>게시판</button><br>
<button>메일</button><br>
<button>카페</button><br>
<button>블로그</button><br>
A. 여기서 로그인을 하면 /loginDBejs 라우트로 보낸다
<form action="http://127.0.0.1:3001/loginDBejs" method="post">
<!-- password 포스트방식보안 -->
<input type="text" name="id"><br>
<input type="password" name="pw"><br><br>
<input type="submit" value="로그인"><br>
</form>
B. html파일에서 로그인 정보인 id, pw를 받아서 멤버 테이블에 있는지 검색하고
C. id를 세션.user에 저장한다
D. 로긴에 성공하면 loginDBejs.ejs 파일을 /loginDBejs 라우터
에서 그대로 렌더링한다.
E. loginDBejs.ejs 에 row_name: row 으로 id, pw가 일치하는
sql열의 모든 정보가 담긴 row를 row_name 으로 loginDBejs.ejs 에
같이 보낸다
* request.session.user = request.body.id
에서 로그인할 때 받은 id 값을 세션이라는 공간의 user 란에
따로 저장한다
router.post('/loginDBejs', (request, response) => {
let id = request.body.id
let pw = request.body.pw
//console.log(id,pw)
request.session.user = id //로긴에성공한사람의아이디를 세션에 저장,conn.문안에적어도괜찮
let sql = `
select *
from member
WHERE id=? and pw=?
`;
conn.query(sql, [id, pw], (err, row) => { //[id,pw,nick]는물음표순서대로그대로
if (err) {
console.log('검색실페에러' + err)
} else if (row.length > 0) {
console.log('로긴성공')
//response.redirect('http://127.0.0.1:5500/public/05.2.LoginS.html')
console.log('session영역에아이디저장성공 저장아이디는: ' + request.session.user);
console.log(row)
console.log('row[0].id: ' + row[0].id)
response.render('loginDBejs', {
row_name: row
})
} else if (row.length == 0) {
console.log('로긴실패')
response.redirect('http://127.0.0.1:5500/public/05.3.LoginF.html')
}
})
});
F. row_name값을 받아서 0인덱의 key:id로 value: 를 뽑는다
ejs문으로 id 님 로그인 하셨습니다
G. 메인ejs링크버튼을 누르면 /MainEJS 라우트로 보낸다
<%=row_name[0].id%>님 로그인 하셨습니다<br><br>
<a href="http://127.0.0.1:3001/MainEJS">메인ejs로 이동</a>
<br><br>
<button>게시판</button><br>
<button>메일</button><br>
<button>카페</button><br>
<button>블로그</button><br>
/MainEJS 라우트로 가면 라우트를 유지하고 MainEJS.ejs 파일을 렌더링한다
router.get('/MainEJS', (request, response) => {
response.render('MainEJS',{
id: request.session.user
})
});
MainEJS.ejs 로 오면 위에서
let id = request.body.id
request.session.user = id
로 session.user에 저장한 id가 null인지 아닌지 확인한다
null이면 로그인하지 않고 온 것이기 때문에 로그인 페이지를
a태그로 로그인 버튼을 달아서 출력하고
id가 null이 아니라 값이 존재하면
로그인을 해서 들어온 것이기 때문에 로그아웃 버튼을 출력한다
로그아웃 버튼을 누르면 /Logout 라우트로 보낸다
<body>
<h1>EJS Main Page 로그인하면 들어오는 메인페이지</h1>
<a href='01.Plus.html'><button> 1. 더하기 </button></a> <br>
<a href='02.Cal.html'><button> 2. 사칙연산 </button></a> <br>
<a href='03.Grade.html'><button> 3. 시험성적 </button></a> <br>
<a href='04.Join.html'><button> 4. 회원데이터입출력 </button></a> <br>
<a href='05.Login.html'><button> 5. 특정아이디와맞는지 </button></a> <br>
<br>
<a href='10.LoginDB.html'><button> 10. [DB] 회원아이디비번있는지확인 </button></a> <br>
<a href='http://127.0.0.1:3001/searchAllDB'><button> 11. [DB] 모든회원검색되는지확인 </button></a> <br>
<br>
<a href='07.JoinDB.html'><button> 7. [DB] 회원가입 </button></a> <br>
<a href='12.loginDBejs.html'><button> 12. [DB][ejs] 로그인 </button></a> <br>
<a href='08.UpdateDB.html'><button> 8. [DB] 회원수정 </button></a> <br>
<a href='06.Delete.html'><button> 6. [DB] 회원삭제 </button></a> <br>
<a href='09.SearchOneDB.html'><button> 9. [DB][ejs] 회원한명찾기 </button></a> <br>
<a href='http://127.0.0.1:3001/searchAllDBejs'><button> 13. [DB][ejs] 모든회원검색 </button></a> <br>
<br>
<a href='http://127.0.0.1:3001/MainEJS'><button> 14. [DB][ejs] ejs 메인 page </button></a> <br>
<br>
<!-- id값이 null이면 로그인하지 않았다는 뜻이니 로그인 버튼을 넣는다 -->
<% if (id==null){%>
<a href='http://127.0.0.1:5500/public/12.loginDBejs.html'><button>로그인</button></a>
<%}else{%>
<a href='http://127.0.0.1:3001/Logout'><button>로그아웃</button></a>
<%}%>
</body>
로그아웃 라우트로 들어오면 세션.유저를 딜리트하고
라우트를 유지하고 MainEJS.ejs를 렌더링하며
id: request.session.user 로 비어있지만 id값을 보낸다
router.get('/Logout', (request, response) => {
delete request.session.user;
response.render('MainEJS', {
id: request.session.user
})
});
이번엔 딜리트를 하고 왔기 때문에 id==null을 만족하여
로그인 버튼을 출력한다
즉 MainEJS.ejs 메인화면에서 로그아웃을 누르면 이 과정이
빠르게 진행되고 라우트를 유지하고 진행하였기 때문에 로그아웃 버튼을
누르면 바로 로그인 버튼으로 바뀐다
<body>
<h1>EJS Main Page 로그인하면 들어오는 메인페이지</h1>
<a href='01.Plus.html'><button> 1. 더하기 </button></a> <br>
<a href='02.Cal.html'><button> 2. 사칙연산 </button></a> <br>
<a href='03.Grade.html'><button> 3. 시험성적 </button></a> <br>
<a href='04.Join.html'><button> 4. 회원데이터입출력 </button></a> <br>
<a href='05.Login.html'><button> 5. 특정아이디와맞는지 </button></a> <br>
<br>
<a href='10.LoginDB.html'><button> 10. [DB] 회원아이디비번있는지확인 </button></a> <br>
<a href='http://127.0.0.1:3001/searchAllDB'><button> 11. [DB] 모든회원검색되는지확인 </button></a> <br>
<br>
<a href='07.JoinDB.html'><button> 7. [DB] 회원가입 </button></a> <br>
<a href='12.loginDBejs.html'><button> 12. [DB][ejs] 로그인 </button></a> <br>
<a href='08.UpdateDB.html'><button> 8. [DB] 회원수정 </button></a> <br>
<a href='06.Delete.html'><button> 6. [DB] 회원삭제 </button></a> <br>
<a href='09.SearchOneDB.html'><button> 9. [DB][ejs] 회원한명찾기 </button></a> <br>
<a href='http://127.0.0.1:3001/searchAllDBejs'><button> 13. [DB][ejs] 모든회원검색 </button></a> <br>
<br>
<a href='http://127.0.0.1:3001/MainEJS'><button> 14. [DB][ejs] ejs 메인 page </button></a> <br>
<br>
<!-- id값이 null이면 로그인하지 않았다는 뜻이니 로그인 버튼을 넣는다 -->
<% if (id==null){%>
<a href='http://127.0.0.1:5500/public/12.loginDBejs.html'><button>로그인</button></a>
<%}else{%>
<a href='http://127.0.0.1:3001/Logout'><button>로그아웃</button></a>
<%}%>
</body>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Main Page</h1>
<a href='01.Plus.html'><button> 1. 더하기 </button></a> <br>
<a href='02.Cal.html'><button> 2. 사칙연산 </button></a> <br>
<a href='03.Grade.html'><button> 3. 시험성적 </button></a> <br>
<a href='04.Join.html'><button> 4. 회원데이터입출력 </button></a> <br>
<a href='05.Login.html'><button> 5. 특정아이디와맞는지 </button></a> <br>
<br>
<a href='10.LoginDB.html'><button> 10. [DB] 회원아이디비번있는지확인 </button></a> <br>
<a href='http://127.0.0.1:3001/searchAllDB'><button> 11. [DB] 모든회원검색되는지확인 </button></a> <br>
<br>
<a href='07.JoinDB.html'><button> 7. [DB] 회원가입 </button></a> <br>
<a href='12.loginDBejs.html'><button> 12. [DB][ejs] 로그인 </button></a> <br>
<a href='08.UpdateDB.html'><button> 8. [DB] 회원수정 </button></a> <br>
<a href='06.Delete.html'><button> 6. [DB] 회원삭제 </button></a> <br>
<a href='09.SearchOneDB.html'><button> 9. [DB][ejs] 회원한명찾기 </button></a> <br>
<a href='http://127.0.0.1:3001/searchAllDBejs'><button> 13. [DB][ejs] 모든회원검색 </button></a> <br>
<br>
<a href='http://127.0.0.1:3001/MainEJS'><button> 14. [DB][ejs] ejs 메인 page </button></a> <br>
<a href='http://127.0.0.1:3001/Main'><button> 15. 메인 page </button></a> <br>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>EJS Main Page 로그인하면 들어오는 메인페이지</h1>
<a href='http://127.0.0.1:5500/public/01.Plus.html'><button> 1. 더하기 </button></a> <br>
<a href='http://127.0.0.1:5500/public/02.Cal.html'><button> 2. 사칙연산 </button></a> <br>
<a href='http://127.0.0.1:5500/public/03.Grade.html'><button> 3. 시험성적 </button></a> <br>
<a href='http://127.0.0.1:5500/public/04.Join.html'><button> 4. 회원데이터입출력 </button></a> <br>
<a href='http://127.0.0.1:5500/public/05.Login.html'><button> 5. 특정아이디와맞는지 </button></a> <br>
<br>
<a href='http://127.0.0.1:5500/public/10.LoginDB.html'><button> 10. [DB] 회원아이디비번있는지확인 </button></a> <br>
<a href='http://127.0.0.1:3001/searchAllDB'><button> 11. [DB] 모든회원검색되는지확인 </button></a> <br>
<br>
<a href='http://127.0.0.1:5500/public/07.JoinDB.html'><button> 7. [DB] 회원가입 </button></a> <br>
<a href='http://127.0.0.1:5500/public/12.loginDBejs.html'><button> 12. [DB][ejs] 로그인 </button></a> <br>
<a href='http://127.0.0.1:5500/public/08.UpdateDB.html'><button> 8. [DB] 회원수정 </button></a> <br>
<a href='http://127.0.0.1:5500/public/06.Delete.html'><button> 6. [DB] 회원삭제 </button></a> <br>
<a href='http://127.0.0.1:5500/public/09.SearchOneDB.html'><button> 9. [DB][ejs] 회원한명찾기 </button></a> <br>
<a href='http://127.0.0.1:3001/searchAllDBejs'><button> 13. [DB][ejs] 모든회원검색 </button></a> <br>
<br>
<a href='http://127.0.0.1:3001/MainEJS'><button> 14. [DB][ejs] ejs 메인 page </button></a> <br>
<a href='http://127.0.0.1:3001/Main'><button> 15. 메인 page </button></a> <br>
<br>
<!-- id값이 null이면 로그인하지 않았다는 뜻이니 로그인 버튼을 넣는다 -->
<% if (id==null){%>
<a href='http://127.0.0.1:5500/public/12.loginDBejs.html'><button>로그인</button></a>
<%}else{%>
<a href='http://127.0.0.1:3001/Logout'><button>로그아웃</button></a>
<%}%>
</body>
</html>
00.Main.html 은 open with live server로 열면
http://127.0.0.1:5500/public/00.Main.html 경로다
MainEJS.ejs 를 라우트로 열면
http://127.0.0.1:3001/MainEJS 경로다
그래서
00.Main.html 에서는 href 에서 http://127.0.0.1:5500/public/
를 생략할 수 있다
MainEJS.ejs 에서는 href 에서 http://127.0.0.1:3001
를 생략할 수 있다