http 요청과 응답을 좀 더 편하게 사용할 수 있도록 도와주는 모듈
express nodejs에서 제일 인기가 많은 모듈
nodejs프레임 워크
http 요청과 응답을 더 쉽게 작성할 수 있도록 도와준다.
기본적인 기능만 포함하고 있어서.
자유도 높고 라우팅 미들웨어 등등 개발자가 원하는 방식으로
구성할 수 있다.
본인만의 보일러 플레이팅이 가능하다.
보일러 플레이팅=>반복적인 작업을 미리 작성해서 개발의 생산성을 높임
express를 사용해보자
const e = require("express");
// 설치 부터 받아 express
// npm
// 서버 객체가 생성
const app = e();
// 메소드를 사용해서
// app.get();
// 요청의 내용이 get메소드인지 post메소드인지
// app.post();
app.get("/", (req, res) => {
// send 메소드로 응답하고 종료
res.send("hello world");
});
app.listen(8080, () => {
console.log("성공했구나 이녀석..");
});
// pacakge.json에 스크립트 명령어 작성
// "test": "echo \"Error: no test specified\" && exit 1",
// "start": "node 20230502/index.js"
// "dev":"node 20230502/index.js"
// start명령어는 ===npm start
// 별도의 네이밍으로 우리가 작성한 스크립트 명령어 실행
// 예)dev 가정하면 npm run dev 이렇게 실행 하면 된다.(start는 특별)
res.send와 end의 차이점은 send는 자동으로 header를 설정해준다.
하지만 end는 수동으로 header를 설정해 주어야한다.
//여기서 사용할 모듈 express path
// path는 내장 모듈
// path 모듈은 경로에 대한 조작을 도와주는 모듈
// 파일 시스템의 경로들을 상대경로나 절대경로 설정 할 수 있도록 도와주는 모듈
// 상대경로나 절대 경로를 쉽게 연경할 수 이도록 메서드를 지원해준다.
const e = require("express");
const path = require("path");
// 서버 인스턴스 생성
const app = e();
// get 방식 요청해서 데이터를 가져오는 메서드
// get 방식으로 /url 요청을 하면
app.get("/", (req, res) => {
//루트 경로 처리
// join메서드가 전달받은 경로를 합쳐주는 동작을 해줌
const body = path.join(__dirname, "views", "index.html");
// 파일까지의 경로를 만들어주고
console.log(body);
// res.send("");
res.sendFile(body);
});
// res.send와 end의 차이점은 send는 자동으로 header를 설정해준다.
// 하지만 end는 수동으로 header를 설정해 주어야한다.
app.get("/list", (req, res) => {
const body = path.join(__dirname, "views", "list.html");
// 브라우저로 파일 보내준다.
res.sendFile(body);
});
app.get("/myPage", (req, res) => {
const body = path.join(__dirname, "views", "mypage.html");
res.sendFile(body);
});
app.listen(8080, () => {
console.log("good");
});
const e = require("express");
const path = require("path");
// 서버 인스턴스 생성
const app = e();
// get 방식 요청해서 데이터를 가져오는 메서드
// get 방식으로 /url 요청을 하면
app.get("/", (req, res) => {
//루트 경로 처리
// join메서드가 전달받은 경로를 합쳐주는 동작을 해줌
const body = path.join(__dirname, "views", "index.html");
// 파일까지의 경로를 만들어주고
console.log(body);
// res.send("");
res.sendFile(body);
});
// express와 템플릿 엔진을 같이 사용해서
// 게시판 만들어보자.
// ejs 템플릿 엔진
const e = require("express");
// 템플릿 엔진은 서버측에서 html을 만들어서 브라우저에 보여주는것.
// 서버 사이드 렌더링(SSR)
// 나중에는 분리할 예정
// html과 동일하고 js를 같이 추가해서 동적인 웹페이지를 만들 수 있는 템플릿 엔진.
// express에서 ejs를 지원한다.
// 서버 측에서 html 템플릿을 그려주고
// 이러한 기법을 서버 사이드 렌더링 이라고 한다.
// 검색 기능 및 페이지 로딩이 빠르다.
// body-parser는 express미들웨어
// 요청으로 받은 body의 내용을 req객체 안에 있는 body라는 key에 value 담아준다.
// req.body로 호출이 가능해진다.
// 미들웨어라는건 쉽게 요청과 응답을 하는 사이 중간에 동작하는 함수
// 사용할 모듈 express,ejs,mysql2,body-parser,path
const mysql2 = require("mysql2");
const path = require("path");
const bodyParser = require("body-parser");
// 서버 인스턴스
const app = e();
// express에 set메서드와 use 메서드가 있습니다~
// set 메서드: express의 view 등등 설정을 할 수가 있다.
// 그려줄 파일이 있는 폴더의 경로 같은 설정을 할 수가 있다.
// use 메서드:요청 또는 응답시 실행되는 미들웨어를 추가 할 수 있다.
// express의 view 속성을 경로로 지정
// express view로 사용할 파일들의 경로
// express도 서버사이드 렌더링을 지원해주기 때문에 view엔진을 사용한다.
// view엔진은 html등의 템플릿 파일을 보여주는 역할을 하는데
app.set("views", path.join(__dirname, "views"));
// view엔진을 ejs로 사용하겠다 설정
// html 확장자도 ejs로 변경
app.set("view engine", "ejs");
// app.use(
// bodyParser.urlencoded({
// // urlencoded from 데이터를 파싱을 도와주는 미들웨어
// extended: false,
// })
// );
//extended true: query string 모듈의 기능이 좀 더 확장된 qs모듈을 사용한다.(깊은 객체를 지원)
// false: express 기본 내장된 쿼리 스트링 모듈 사용(깊은 객체 지원 x)
// 권장은 false
// 복잡한 데이터를 다루게 되면 쓸 수도 있겠는데 없으니 false로 사용하자.
// express 버전이 올라가면서 bodyParser를 지원해준다.
app.use(e.urlencoded({ extended: false }));
const mysql = mysql2.createConnection({
user: "root",
password: "q1w2e3R$",
database: "test2",
});
mysql.query("SELECT * FROM products", (err, res) => {
if (err) {
const sql =
"CREATE TABLE products(id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(20),number VARCHAR(20),series VARCHAR(20))";
mysql.query(sql);
} else {
console.log(res);
}
});
app.get("/", (req, res) => {
// 루트 경로로 요청시 처리
// 메인페이지
mysql.query("SELECT * FROM products", (err, result) => {
// render 메서드 view엔진이 문자열을 html로 브라우저에 반환해서 렌더링 해준다.
// 첫번째 매개변수가 view로 설정한 폴더경로에 파일의 이름을 문자열로 전달.
// 두번째 매개변수 템플린 엔진에서 사용할 데이터(객체 형식)
res.render("main", { data: result });
});
});
// 추가하는 페이지로 가자
// 리스트를 추가하는 페이지
// get 방식 요청인지,post 방식 요청인지 나뉨
app.get("/insert", (req, res) => {
res.render("insert");
res.send();
});
app.post("/insert", (req, res) => {
const data = req.body;
// body 객체 안에 form에서 요청을 보냄
// 데이터가 객체로 들어있다. 객체 안에 있는 키값들은
// inputdml name으로 정해준 키로 값이 들어있다.
// 우리가 요청한 데이터의 내용을 데이터 베이스에 추가하자
const sql = "INSERT INTO products (name,number,series)VALUES(?,?,?)";
console.log(data);
// query 메서드 두번째 매개변수로 배열의 형태로 value를 전달 해 줄수 있다.
// 순서대로 ?에 들어감
mysql.query(sql, [data.name, data.number, data.series], (err, result) => {
// redirect 메서드로 매개변수로 전달한 URL로 페이지를 전환 시킨다.
// 경로로 이동시킨다.
res.redirect("/");
});
});
// 삭제를 해봅시다.
app.get("/delete/:id", (req, res) => {
// :id url요청에서 파라메터 값이라고 합니다.
// 아는 req.params.id로 가져올 수 있다.
const sql = "DELETE FROM products WHERE id=?";
mysql.query(sql, [req.params.id], () => {
res.redirect("/");
});
});
app.listen(8080, () => {
console.log("성공했구나 이녀석..");
});
const e = require("express");
const mysql2 = require("mysql2");
const path = require("path");
const app = e();
// express에 set메서드와 use 메서드가 있습니다~
// set 메서드: express의 view 등등 설정을 할 수가 있다.
// 그려줄 파일이 있는 폴더의 경로 같은 설정을 할 수가 있다.
// use 메서드:요청 또는 응답시 실행되는 미들웨어를 추가 할 수 있다.
// express의 view 속성을 경로로 지정
// express view로 사용할 파일들의 경로
// express도 서버사이드 렌더링을 지원해주기 때문에 view엔진을 사용한다.
// view엔진은 html등의 템플릿 파일을 보여주는 역할을 하는데
app.set("views", path.join(__dirname, "views"));
// view엔진을 ejs로 사용하겠다 설정
// html 확장자도 ejs로 변경
app.set("view engine", "ejs");
//extended true: query string 모듈의 기능이 좀 더 확장된 qs모듈을 사용한다.(깊은 객체를 지원)
// false: express 기본 내장된 쿼리 스트링 모듈 사용(깊은 객체 지원 x)
// 권장은 false
// 복잡한 데이터를 다루게 되면 쓸 수도 있겠는데 없으니 false로 사용하자.
// express 버전이 올라가면서 bodyParser를 지원해준다.
app.use(e.urlencoded({ extended: false }));
const mysql = mysql2.createConnection({
user: "root",
password: "q1w2e3R$",
database: "test2",
});
mysql.query("SELECT * FROM products", (err, res) => {
if (err) {
const sql =
"CREATE TABLE products(id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(20),number VARCHAR(20),series VARCHAR(20))";
mysql.query(sql);
} else {
console.log(res);
}
});
<table style="width: 100%">
<a href="/insert">추가 페이지</a>
<tr>
<th>삭제</th>
<th>수정</th>
<th>아이디</th>
<th>아름</th>
<th>전화번호</th>
<th>시리즈</th>
</tr>
<!-- 페이지에 리스트면 여러개의 데이터가 있을 텐데 -->
<!-- html에서 동적으로 뭔가를 해본적이 없죠? -->
<% data.forEach(function(el,index){ %>
<tr>
<td>삭제</td>
<td>수정</td>
<td><%= el.id %></td>
<td><%= el.name %></td>
<td><%= el.number %></td>
<td><%= el.series %></td>
</tr>
<% }); %>
</table>
<!-- post 방식의 메소드로 데이터를 보냄 -->
<!-- action 요청을 url 없다면 현재 url -->
<form action="/insert" method="post">
<label for="">이름</label>
<input type="text" name="name" />
<label for="">전화번호</label>
<input type="text" name="number" />
<label for="">시리즈</label>
<input type="text" name="series" />
<button type="submit">추가</button>
</form>
app.post("/insert", (req, res) => {
const data = req.body;
// body 객체 안에 form에서 요청을 보냄
// 데이터가 객체로 들어있다. 객체 안에 있는 키값들은
// inputdml name으로 정해준 키로 값이 들어있다.
// 우리가 요청한 데이터의 내용을 데이터 베이스에 추가하자
const sql = "INSERT INTO products (name,number,series)VALUES(?,?,?)";
console.log(data);
// query 메서드 두번째 매개변수로 배열의 형태로 value를 전달 해 줄수 있다.
// 순서대로 ?에 들어감
mysql.query(sql, [data.name, data.number, data.series], (err, result) => {
// redirect 메서드로 매개변수로 전달한 URL로 페이지를 전환 시킨다.
// 경로로 이동시킨다.
res.redirect("/");
});
});
// 삭제를 해봅시다.
app.get("/delete/:id", (req, res) => {
// :id url요청에서 파라메터 값이라고 합니다.
// 아는 req.params.id로 가져올 수 있다.
const sql = "DELETE FROM products WHERE id=?";
mysql.query(sql, [req.params.id], () => {
res.redirect("/");
});
});