npm init
npm init -yes
npm install 패키지이름
const app = express();
app.METHOD(PATH, callback [,callback…]);
<!--index.html-->
<h1 style="color:tomato">안녕하세요</h1>
<img src="/public/images/동글이.jpg" alt="동글이">
//index.js
const express = require("express");
const app = express(); //객체생성, 필요한 메소드가 app객체에 있다. 기본코드
const port = 8080; //1023위의 숫자로, 보통 8080 8000 3000 많이함
// static 메소드 : 안의 문자열은 실제 존재하는 폴더명
//첫번째거(/public)은 가상경로
app.use("/public", express.static("static"));
//static이라는 실제 존재하는 폴더를 public이라는 경로로 접근할 수 있도록 함
app.get('/', (req,res) =>{
res.send('Hello Express!');
})
app.get('/test', (req,res)=>{
res.sendFile(__dirname + "/views/index.html"); //절대경로만 입력하기
})
app.listen(port, ()=>{
console.log("Server Open : ", port);
})
<% for(let i = 0; i<5; i++) { %>
<div>안녕</div>
<% } %>
<% if(true) {%>
<% } else if(){%>
<% } else{%>
<%} %>
<div style="color:red;"><%="<span style='color:blue'>안녕</span>"%> 하세요</div>
<div style="color:red;"><%-"<span style='color:blue'>안녕</span>"%> 하세요</div>
=
: 변수의 값을 출력할 때 사용
-
: 태그로 인식할 수 있다
다른 ejs파일 불러오기
<%-include("test.ejs")%>
ejs파일에 데이터 넘기고 받기
<title><%=title%></title>
<% for(let i = 0; i<data.length; i++){ %>
<div><%=data[i]%></div>
<%}%>
2번째 줄의 data는 이미 <%%>안이라 바로 data.length할 수 있고, 3번째줄은 없어서 <%%>다시 열어줌
action : 폼을 전송할 서버 주소 지정
name : 폼을 식별하기 위한 이름
method : 폼을 서버에 전송할 http 메소드 지정
targer : action 속성값에 지정한 스크립트 파일을 현재창이 아닌 다른위치에서 열 수 있게(_blank와 _self가 있다)
post요청하면 req.body에
get 요청하면 req.query에
url을 치는 것은 무조건 get요청이기 때문에 get요청 성공페이지는 url로 쳐서 나오지만 post는 불가능하다
소문자, 숫자 포함 4자리 이상 : pattern="^([a-z0-9]){4,}$"
대문자 필수 : (?=.*[A-Z])
한글 제외 : ([^가-힣])
javascript를 응용해 유효성 검사를 할 수도 있다
const text = "안녕하세요 https://tistory.com//"
console.log(text.match(/https?:\/\/[\w\-\.]+/g));
/http : http로 시작
s? : s가 있을 수도 없을 수도
: :그 다음 ":"가 오고
\/\/ : //가 오고
[\w\-\.]+ => \w(영문자, 언더스코어), 하이픈, 쩜 으 로 이루어진 문자열이 한개 이상(+) 있다.
/g : 해당하는 모든걸 찾는다
서버 측 코드가 변경될 때마다 ctrl+c로 node명령어 종료하고 다시 입력하기가 귀찮다
따라서 서버 측 소스코드 변경시 자동으로 node재실행 하는 패키지
참고로 노드몬 실행할 땐 powershell말고 다른 터미널로 하기
데이터 포맷
서버와 클라이언트간의 교류에서 일반적으로 많이 사용된다
자바스크립트 객체 표기법과 유사
텍스트형식일 뿐이다
function sendGet() {
let form = document.getElementById("form_info");
//form.name.value로 가져올 수 있다
//axios get을 이용한 통신
axios({
method: "get",
url : "/form",
params : {
name : form.name.value,
age : form.age.value,
},
}).then((res)=>{
console.log(res.data.msg);
});
}
app.get('/form', (req,res)=>{
console.log(req.query);
res.send({msg: `이름은 ${req.query.name}, 나이는 ${req.query.age}`,});
})
enctype="multipart/form-data" : 파일이 인코딩되면 깨질수 있어서 쓰는 타입
//index.js
const upload = multer({
dest: "uploads/", //목적지 설정, 여기에 올리겠다
});
app.post('/upload', upload.single("userfile"), (req,res)=>{
console.log(req.file);
console.log(req.body);
res.send("Upload Complete");
})
//file.ejs
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="userfile" >
<button>업로드</button>
</form>
//index.js
app.post('/upload-array', upload.array("userfile2"), (req,res)=>{
console.log(req.files);
console.log(req.body);
res.send("Upload Complete");
})
//file.ejs
<form action="/upload-array" method="post" enctype="multipart/form-data">
<label for="userfile2">파일여러개</label>
<input type="file" name="userfile2" multiple> //여러개
<button>업로드2</button>
</form>
//index.js
//Before
const upload = multer({
dest: "uploads/", //목적지 설정, 여기에 올리겠다
});
//After
const upload = multer({
storage: multer.diskStorage({
destination(req, file,done){ //목적지 설정 함수
done(null, 'uploads/'); // 파라미터 : 에러가있을 때 받는것, 경로
},
filename(req,file,done){ //파일 이름 지정 함수
console.log(req.body); // 해당 input file전까지의 body만 받아서 name2는 안나옴!
const ext = path.extname(file.originalname); //확장자 지정
//const filename = Date.now() + ext;
const filename = req.body.name + ext;
done(null, filename);
}
})
})
app.post('/upload-fields', upload.fields([{name:'name'}, {name:'userfile'}, {name:'name2'}]), (req,res)=>{
console.log(req.files);
console.log(req.body);
res.send("Upload Complete");
})
//file.js
<h3>파일 하나</h3>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="text" name="name" id="">
<input type="file" name="userfile" >
<input type="text" name="name2" id="">
<button>업로드</button>
</form>