后端nodeexpress框架基本使用
cgdexpress 初体验
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| const express = require("express");
const app = express();
app.get("/", (req, res, next) => { res.send(200, "Hello Express"); });
app.post("/", (req, res, next) => { res.send("Hello Express"); });
app.listen(3000, () => { console.log("服务启动成功"); });
|
express 中间件
中间件是什么呢?
中间件的本质是传递给 express 的一个回调函数,这个回调函数接受三个参数:
请求对象(request 对象)
响应对象(response 对象)
next 函数(在 express 中定义的用于执行下一个中间件的函数)
中间件中可以执行哪些任务呢
- 执行任何代码
- 更改请求(request)和响应(response)对象
- 结束请求-响应周期(返回数据)
- 调用栈中的下一个中间件
如何使用中间件
- express 主要提供了两种方式:app/router.use 和 app/router.methods
- 可以是 app,也可以是 router
- methods 指的是常用的请求方式,比如: app.get 或 app.post 等
中间件的基本使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| const express = require("express");
const app = express();
app.use((req, res, next) => { console.log("注册了第一个中间件"); next(); }); app.use("/home", (req, res, next) => { console.log("注册了第二个中间件"); next(); }); app.get("/home", (req, res, next) => { console.log("注册了第三个中间件"); }); app.post("/home", (req, res, next) => { console.log("注册了第四个中间件"); next(); }); app.use((req, res, next) => { console.log("注册了第五个中间件"); next(); }); app.use((req, res, next) => { console.log("注册了第六个中间件"); res.send("结束"); });
app.listen(3000, () => { console.log("服务启动成功"); });
|
==刚开始匹配第一个符合的中间件,如果调用了 next 方法会继续向下匹配符合条件的中间件,没有 next 方法则只会匹配第一个符合的中间件==
例如:
中间件的连续调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| const express = require("express");
const app = express();
app.get( "/home", (req, res, next) => { console.log("111"); next(); }, (req, res, next) => { console.log("222"); next(); }, (req, res, next) => { console.log("333"); next(); }, (req, res, next) => { res.send("结束"); } );
app.listen(3000, () => { console.log("服务启动成功"); });
|
中间件解析 json 和 urlencoded
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| const express = require("express");
const app = express();
app.use((req, res, next) => { console.log(req.headers["content-type"]); if (req.headers["content-type"] === "application/json") { req.on("data", (data) => { req.body = JSON.parse(data.toString()); }); req.on("end", () => { next(); }); } else { next(); } });
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.post("/login", (req, res, next) => { console.log(req.body); res.send("结束"); });
app.listen(3000, () => { console.log("服务启动成功"); });
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| const express = require('express') const multer = require('multer')
const app = express() const upload = multer()
app.use(upload.any
app.post('/login',upload.any(), (req, res, next) => { console.log(req.body) res.send('结束') })
app.listen(3000, () => { console.log('服务启动成功') })
|
中间件处理文件上传
上传单个文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const express = require("express"); const multer = require("multer");
const app = express(); const upload = multer({ dest: "./uploads", });
app.post("/upload", upload.single("file"), (req, res, next) => { console.log(req.file); res.send("文件上传成功"); });
app.listen(3000, () => { console.log("服务启动成功"); });
|
上传多个文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const express = require("express"); const multer = require("multer");
const app = express(); const upload = multer({ dest: "./uploads", });
app.post("/upload", upload.array("file"), (req, res, next) => { console.log(req.files); res.send("文件上传成功"); });
app.listen(3000, () => { console.log("服务启动成功"); });
|
指定文件名字和后缀名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| const path = require("path");
const express = require("express"); const multer = require("multer");
const app = express();
const storage = multer.diskStorage({ destination: (req, file, callback) => { callback(null, "./uploads/"); }, filename: (req, file, callback) => { callback(null, Date.now() + path.extname(file.originalname)); }, });
const upload = multer({ storage, });
app.post("/upload", upload.single("file"), (req, res, next) => { res.send("文件上传成功"); });
app.listen(3000, () => { console.log("服务启动成功"); });
|
部署静态资源
1 2 3 4 5 6 7 8 9 10
| const express = require("express");
const app = express();
app.use(express.static("./build"));
app.listen(3000, () => { console.log("服务启动成功"); });
|
中间件保存日志信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| const fs = require("fs"); const express = require("express"); const morgan = require("morgan");
const app = express(); const writeStream = fs.createWriteStream("./logs", { flags: "a+", }); app.use(morgan("combined", { stream: writeStream })); app.get("/", (req, res, next) => { res.send("Hello"); });
app.listen(3000, () => { console.log("服务启动成功"); });
|
获取 query 和 params 参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| const express = require("express");
const app = express();
app.get("/user/:id", (req, res, next) => { console.log(req.params); const { id } = req.params; res.send("Hello"); }); app.get("/login", (req, res, next) => { console.log(req.query); const { username, password } = req.query; res.send("Hello"); });
app.listen(3000, () => { console.log("服务启动成功"); });
|
express 路由的使用
在 router 文件夹新建 user.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| const express = require("express");
const router = express.Router();
router.get("/", (req, res, next) => { res.send("获取用户列表成功"); }); router.post("/", (req, res, next) => { res.send("添加用户列表成功"); }); router.delete("/:id", (req, res, next) => { res.send("删除用户成功"); });
module.exports = router;
|
在 index 中使用路由中间件
1 2 3 4 5 6 7 8 9 10
| const express = require("express");
const userRouter = require("./router/users"); const app = express();
app.use("/user", userRouter);
app.listen(3000, () => { console.log("服务启动成功"); });
|