[Express μΉ μλ² λ§λ€κΈ°] (2) λ―Έλ€μ¨μ΄ μ’ λ₯ & multer μ¬μ©νκΈ°
<λ³Έ λΈλ‘κ·Έλ Node.js κ΅κ³Όμλ₯Ό μ°Έκ³ ν΄μ 곡λΆνλ©° μμ±νμμ΅λλ€ :-)>
π λ€μν λ―Έλ€μ¨μ΄
π dotenv
: .env νμΌμ μ½μ΄μ process.envλ‘ λ§λ λ€
π morgan
: λ‘κ·Έ μΆλ ₯
ex) combined, common, short, tiny
// dev
[HTTP λ©μλ] [μ£Όμ] [HTTP μν μ½λ] [μλ΅ μλ]-[μλ΅ λ°μ΄νΈ]
π static
: μ μ μΈ νμΌλ€μ μ 곡νλ λΌμ°ν° μν
: ν¨μμ μΈμλ‘ μ μ νμΌλ€μ΄ λ΄κ²¨ μλ ν΄λλ₯Ό μ§μ νλ€
π body-parser
: μμ²μ λ³Έλ¬Έμ μλ λ°μ΄ν°λ₯Ό ν΄μν΄μ req.body κ°μ²΄λ‘ λ§λ€μ΄μ£Όλ λ―Έλ€μ¨μ΄
: νΌ λ°μ΄ν°λ AJAX λ°μ΄ν° μ²λ¦¬
// μμ²μ λ³Έλ¬Έμ΄ λ²νΌ λ°μ΄ν° μΌ λ
app.use(bodyParser.raw());
// ν
μ€νΈ λ°μ΄ν°μΌ λ ν΄μ
app.use(bodyParser.text());
// false : λ
Έλμ querystring λͺ¨λμ μ¬μ©νμ¬ μΏΌλ¦¬μ€νΈλ§μ ν΄μ
// true : λ
Έλμ qs λͺ¨λμ μ¬μ©νμ¬ μΏΌλ¦¬μ€νΈλ§μ ν΄μ
{ extended: false }
π cookie-parser
: μμ²μ λλ΄λ μΏ ν€λ₯Ό ν΄μν΄ req.cookies κ°μ²΄λ‘ λ§λ λ€
res.cookie(ν€, κ°, μ΅μ
)
π express-session
: μΈμ κ΄λ¦¬μ© λ―Έλ€μ¨μ΄
: μΈμ μ ꡬννκ±°λ νΉμ μ¬μ©μλ₯Ό μν λ°μ΄ν°λ₯Ό μμμ μΌλ‘ μ μ₯ν΄λ λ λ§€μ° μ μ©
app.use(session({
// μμ²μ΄ μ¬ λ μΈμ
μ μμ μ¬νμ΄ μκΈ°μ§ μλλΌλ λ€μ μ μ₯ν μ§ μ€μ
resave: false,
// μΈμ
μ μ μ₯ν λ΄μμ΄ μλλΌλ μ²μλΆν° μΈμ
μ μμ±ν μ§ μ€μ
saveUninitialized: false,
// μΏ ν€λ₯Ό μλͺ
νλλ° secret κ° νμ
secret: process.env.COOKIE_SECRET,
// tptus znzldp eogks tjfwjd
cookie: {
// ν΄λΌμ΄μΈνΈμμ μΏ ν€ νμΈ λͺ»ν¨
httpOnly: true,
// https κ° μλ νκ²½μμλ μ¬μ© κ°λ₯
secure: false,
// => λ°°ν¬μ https μ μ© true μ€μ μ΄ μ’μ
},
name: "session-cookie",
}));
π multer
: μ΄λ―Έμ§, λμμ λ±μ λΉλ‘―ν μ¬λ¬ κ°μ§ νμΌλ€μ λ©ν°ννΈ νμμΌλ‘ μ λ‘λν λ μ¬μ©νλ λ―Έλ€μ¨μ΄
: λ©ν°ννΈλ enctypeμ΄ multipart/form-data νΌμ ν΅ν΄ μ λ‘λνλ λ°μ΄ν°μ νμ
π multer λ‘ μ΄λ―Έμ§ μ λ‘λνκΈ°
π app.js
// express : http λͺ¨λ λ΄μ₯λμ΄μ μλ²μ μν
const express = require("express");
const app = express();
// process.env κ΄λ¦¬
const dotenv = require("dotenv");
// λ―Έλ€μ¨μ΄
const cookieParser = require("cookie-parser");
const session = require("express-session");
const morgan = require("morgan");
const multer = require("multer");
const fs = require("fs");
// νμΌ κ²½λ‘
const path = require("path");
const { fstat } = require("fs");
require("dotenv").config();
dotenv.config();
// μλ²κ° μ€νλ ν¬νΈ
// app.set("ν€, κ°") : λ°μ΄ν° μ μ₯
app.set("port", process.env.PORT || 8000);
// dev : [HTTP λ©μλ][μ£Όμ][HTTP μν μ½λ][μλ΅ μ½λ]-[μλ΅ λ°μ΄νΈ]
app.use(morgan("dev"));
app.use("/", express.static(path.join(__dirname, "public")));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
// μμ²μ΄ μ¬ λ μΈμ
μ μμ μ¬νμ΄ μκΈ°μ§ μλλΌλ λ€μ μ μ₯ν μ§ μ€μ
resave: false,
// μΈμ
μ μ μ₯ν λ΄μμ΄ μλλΌλ μ²μλΆν° μΈμ
μ μμ±ν μ§ μ€μ
saveUninitialized: false,
// μΏ ν€λ₯Ό μλͺ
νλλ° secret κ° νμ
secret: process.env.COOKIE_SECRET,
// tptus znzldp eogks tjfwjd
cookie: {
// ν΄λΌμ΄μΈνΈμμ μΏ ν€ νμΈ λͺ»ν¨
httpOnly: true,
// https κ° μλ νκ²½μμλ μ¬μ© κ°λ₯
secure: false,
// => λ°°ν¬μ https μ μ© true μ€μ μ΄ μ’μ
},
name: "session-cookie",
}));
// multer
try {
fs.readdirSync("uplads");
} catch (error) {
console.error("uploads ν΄λκ° μμ΄ uploads ν΄λ μμ±ν¨");
fs.mkdirSync("uploads");
}
const upload = multer({
// μ΄λμ(destination) μ΄λ€ μ΄λ¦(filename)μΌλ‘ μ μ₯ν μ§
storage: multer.diskStorage({
destination(req, file, done) {
done(null, "uploads/");
},
filename(req, file, done) {
const ext = path.extname(file.originalname);
// νμΌλͺ
+νμ¬μκ°.νμ₯μ νμΌλͺ
μΌλ‘ μ
λ‘λ
done(null, path.basename(file.originalname, ext) + Date.now() + ext);
},
}),
// μ
λ‘λμ λν μ ν μ¬ν
// νμΌ μ¬μ΄μ¦(fileSize, λ°μ΄νΈ λ¨μ)
limits: { fileSize: 5 * 1024 * 1024 },
});
// λ―Έλ€μ¨μ΄ : μμ²κ³Ό μλ΅μ μ‘°μ
// μμ², μλ΅, λ€μ λ―Έλ€μ¨μ΄λ‘ λμ΄κ°κΈ°
app.get("/upload", (req, res) => {
res.sendFile(path.join(__dirname, "multipart.html"));
});
app.post("/upload",
upload.fields([{ name: "image1" }, { name: "image2" }]),
(req, res) => {
console.log(req.filies, req.body);
res.send("ok");
},);
app.use((req, res, next) => {
console.log("λͺ¨λ μμ²μ λ€ μ€νλ¨");
next();
});
app.get("/", (req, res, next) => {
console.log("GET / μμ²μμλ§ μ€ν");
next();
}, (req, res) => {
throw new Error("μλ¬λ μλ¬ μ²λ¦¬ λ―Έλ€μ¨μ΄λ‘ κ°λ€");
});
app.use((err, req, res, next) => {
console.error(err);
res.status(500).send(err.message);
});
// HTTP μΉ μλ²μ λμΌ
app.listen(app.get("port"), () => {
console.log(app.get("port"), "λΉ ν¬νΈμμ λκΈ°μ€");
});
π multipart.html
<form action="/upload" method="post" enctype="multipart/form">
<input type="file" name="image1" />
<input type="file" name="image2" />
<input type="text" name="title" />
<button type="submit">μ
λ‘λ</button>
</form>