一、简洁的路由系统
1. 基本路由
通过 `app.METHOD()` 来定义路由,其中 `METHOD` 可以是 `get`、`post`、`put`、`delete` 等 HTTP 方法。
const express = require("express");
const app = express();
app.get("/", (req, res) => {
res.send("Hello, World!");
});
app.post("/submit", (req, res) => {
res.send("Data submitted successfully");
});
2. 路由参数
可在 URL 中使用冒号 `:` 定义参数。
app.get("/users/:userId", (req, res) => {
res.send(`User ID: ${req.params.userId}`);
});
二、中间件支持
1. 中间件概念
中间件是 `express` 的核心概念,它是一个函数,可访问请求对象 `req`、响应对象 `res` 和下一个中间件函数 `next`。中间件可以对请求进行处理,修改请求和响应对象,或执行其他操作,如日志记录、身份验证、数据解析等。
const express = require("express");
const app = express();
const logger = (req, res, next) => {
console.log(`${req.method} request for ${req.url}`);
// `next()` 函数将控制权传递给下一个中间件或路由处理函数。
next();
};
app.use(logger);
app.get("/", (req, res) => {
res.send("Hello, World!");
});
2. 内置中间件
`express` 自带一些常用的中间件,如 :
`express.json()`:用于解析 JSON 格式的请求体
`express.urlencoded()`:用于解析 `x-www-form-urlencoded` 格式的请求体
`express.static()`:用于提供静态文件服务
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
// 将 `public` 目录下的文件作为静态文件提供服务
app.use(express.static("public"));
三、模板引擎支持
1. 模板引擎集成
可轻松集成多种模板引擎,如 `EJS`、`Pug`、`Handlebars` 等,用于渲染动态内容。例如使用 `EJS` 模板引擎:
const express = require("express");
const app = express();
app.set("view engine", "ejs");
app.get("/", (req, res) => {
res.render("index", { title: "Home Page" });
});
四、错误处理
1. 错误处理中间件
可以使用专门的错误处理中间件处理错误,它的函数签名是 `(err, req, res, next)`。
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send("Something broke!");
});
五、链式调用
1. 链式路由处理
可以通过链式调用 `route()` 方法对同一路径进行多种 HTTP 方法的路由定义。如下对 `/book` 路径的 `GET`、`POST`、`PUT` 请求分别进行了处理。
app
.route("/book")
.get((req, res) => {
res.send("Get a random book");
})
.post((req, res) => {
res.send("Add a new book");
})
.put((req, res) => {
res.send("Update the book");
});
六、应用级和路由级中间件
1. 应用级中间件
使用 `app.use()` 或 `app.METHOD()` 挂载在整个应用或特定路由上的中间件。
例如 `app.use(logger)` 是应用级中间件,会对所有请求起作用,而 `app.get('/', middleware, (req, res) => {...})` 中 `middleware` 是路由级中间件,仅对 `/` 路径的 `GET` 请求起作用。
七、环境变量支持
1. 环境变量设置
可根据不同的环境(如开发、测试、生产)设置不同的配置,例如
const express = require("express");
const app = express();
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});
八、扩展性和灵活性
1. 插件和扩展
可以通过使用中间件和第三方模块方便地扩展 `express` 的功能,如 `body-parser`、`helmet`、`cors` 等,增强安全性、处理跨域请求等。
通过这些特性,`express` 为开发人员提供了一个强大、灵活且易于使用的 Node.js 网络应用开发框架,可用于构建各种类型的 Web 应用程序,从简单的 API 服务到复杂的全栈应用。