提供静态文件、处理 HTML 表单,并借助 multer 接收简单的文件上传。
在 Kodokon 中打开本课一个 API 并不只返回 JSON。HTML 页面、图片、样式表、一份前端构建产物:Express 只用一个中间件 express.static 就能把这一切都提供出去。文件夹里的每个文件都能通过对应的 URL 访问到:public/logo.png 会在 /logo.png 上作出响应。
import express from "express";
const app = express();
app.use(express.static("public"));
app.listen(3000, () => {
console.log("http://localhost:3000");
});我们来看看表单。一个经典的 HTML 表单会以 application/x-www-form-urlencoded 格式发送它的各个字段。express.urlencoded 中间件会解码它们并填充 req.body,就像 express.json 处理 JSON 那样。在 public/ 里放一个页面,里面有一个 method 设为 POST、action 设为 /contact 的表单,然后处理它的提交:
app.use(express.urlencoded({ extended: true }));
app.post("/contact", (req, res) => {
const { name, message } = req.body;
if (!name || !message) {
return res.status(400).send("Required fields");
}
res.send("Thank you " + name + ", message received.");
});要发送一个文件,表单必须声明值为 multipart/form-data 的 enctype,并包含一个类型为 file、例如命名为 avatar 的 input 字段。Express 自己无法解码这种格式:业界标配的中间件是 multer。
npm install multerimport multer from "multer";
const upload = multer({
dest: "uploads/",
limits: { fileSize: 2 * 1024 * 1024 }
});
app.post(
"/avatar",
upload.single("avatar"),
(req, res) => {
if (!req.file) {
return res.status(400).json({
error: "No file received"
});
}
res.status(201).json({
name: req.file.filename,
size: req.file.size
});
}
);express.static 作用于 public 文件夹时,它会做什么?req.body?express.json()express.urlencoded()express.static()GET 的 methodmultipart/form-data 的 enctype_blank 的 target