1. Express.js 中的中间件
中间件是 Express.js 的核心概念之一,它是一个函数,可以处理 HTTP 请求和响应。中间件可以在请求到达路由处理函数之前、之后或中间进行操作,用于执行各种任务,如身份验证、日志记录、数据转换等。
中间件的作用包括:
- 请求预处理:在路由处理函数之前执行一些必要的操作,如解析请求体、检查身份验证等。
- 路由级别中间件:为特定路由或路由组设置中间件,以在特定路由上执行特定任务。
- 错误处理:处理在路由处理过程中产生的错误,以确保错误的友好响应。
- 静态文件服务:通过中间件提供静态文件(如 CSS、JavaScript、图像等)。
Express.js 的中间件可以使用 app.use()
或路由特定的 app.METHOD()
方法添加到应用程序中。
2. 处理路由和请求
在 Express.js 中,路由用于确定应该执行哪个处理函数以响应特定的 HTTP 请求。可以使用 app.METHOD(path, handler)
方法定义路由,其中 METHOD
是 HTTP 请求方法(如 GET、POST、PUT、DELETE),path
是路由的 URL 路径,handler
是路由处理函数。
例如:
const express = require('express'); const app = express(); app.get('/', (req, res) => { res.send('Hello, World!'); });
上述代码定义了一个 GET 请求的根路由,当用户访问根路径时,会触发路由处理函数,响应 “Hello, World!”。
3. RESTful 路由
RESTful 路由是一种遵循 REST(Representational State Transfer)原则的路由设计风格,它将资源映射到 URL 和 HTTP 方法上。在 Express.js 中,可以使用 HTTP 方法和 URL 来定义 RESTful 路由,例如:
app.get('/api/posts', (req, res) => { // 获取所有文章列表 }); app.get('/api/posts/:id', (req, res) => { // 获取特定文章 }); app.post('/api/posts', (req, res) => { // 创建新文章 }); app.put('/api/posts/:id', (req, res) => { // 更新特定文章 }); app.delete('/api/posts/:id', (req, res) => { // 删除特定文章 });
上述示例中,通过使用不同的 HTTP 方法和 URL,可以定义获取、创建、更新和删除资源的路由。这符合 RESTful 设计原则,使 API 更具可读性和一致性。
4. 身份验证和授权
在 Express.js 中,身份验证和授权可以通过中间件来实现。常用的身份验证中间件包括 Passport.js,它支持多种身份验证策略,如本地用户名密码、OAuth、JWT 等。
以下是使用 Passport.js 进行身份验证的示例:
const passport = require('passport'); // 配置本地用户名密码策略 passport.use(new LocalStrategy( (username, password, done) => { // 根据用户名和密码验证用户身份 // 如果验证成功,调用 done(null, user);如果失败,调用 done(null, false) } )); // 在路由中使用身份验证中间件 app.post('/login', passport.authenticate('local', { successRedirect: '/dashboard', failureRedirect: '/login', }) );
授权可以通过在路由处理函数中检查用户的角色或权限来实现,以决定是否允许访问特定资源。
5. 视图引擎
Express.js 支持多种视图引擎,用于渲染动态内容并生成 HTML 页面。一些常见的视图引擎包括 EJS、Pug(之前称为 Jade)、Handlebars 等。
以下是使用 EJS 视图引擎的示例:
const express = require('express'); const app = express(); // 设置视图引擎 app.set('view engine', 'ejs'); app.set('views', path.join(__dirname, 'views')); app.get('/', (req, res) => { // 渲染视图并传递数据 res.render('index', { title: 'Express App' }); });
在上述示例中,首先通过 app.set
方法设置视图引擎为 EJS,并指定视图文件的目录。然后,在路由处理函数中使用 res.render
渲染视图,将数据传递给视图以动态生成页面内容。视图引擎使得创建动态网页变得更加容易。
6. 错误处理中间件
错误处理中间件是 Express.js 中用于处理应用程序中出现的错误的中间件。它们的主要作用是捕获和处理在请求处理过程中发生的异常,以确保应用程序的稳定性,并向客户端发送适当的错误响应。
错误处理中间件通常是一个函数,接收四个参数:err(错误对象)、req(请求对象)、res(响应对象)和 next(下一个中间件函数)。当某个中间件或路由处理函数中抛出错误时,Express.js 会将控制权交给错误处理中间件。
以下是一个简单的错误处理中间件示例:
app.use((err, req, res, next) => { console.error(err.stack); res.status(500).send('Something went wrong!'); });
在上述示例中,如果在请求处理过程中抛出错误,它将被捕获并导致服务器返回状态码 500 的错误响应。
7. 文件上传处理
在 Express.js 中处理文件上传通常涉及使用第三方中间件,如 multer
。以下是一个使用 multer
处理文件上传的示例:
const express = require('express'); const multer = require('multer'); const app = express(); // 配置文件上传 const storage = multer.diskStorage({ destination: (req, file, cb) => { cb(null, 'uploads/'); }, filename: (req, file, cb) => { cb(null, file.originalname); }, }); const upload = multer({ storage }); // 处理文件上传 app.post('/upload', upload.single('file'), (req, res) => { res.send('文件上传成功'); }); app.listen(3000, () => { console.log('服务器正在监听端口 3000'); });
在上述示例中,使用 multer
中间件来配置文件上传,然后在路由中使用 upload.single('file')
处理单个文件上传。上传的文件将被保存到指定的目录。
8. Cookie 和 Session 管理
在 Express.js 中,可以使用中间件来处理 Cookie 和 Session。常用的中间件包括 cookie-parser
用于解析 Cookie 和 express-session
用于管理 Session。
- 使用
cookie-parser
中间件可以解析客户端发送的 Cookie。
const cookieParser = require('cookie-parser'); app.use(cookieParser());
- 使用
express-session
中间件可以创建和管理用户 Session。
const expressSession = require('express-session'); app.use(expressSession({ secret: 'mySecretKey', resave: false, saveUninitialized: true, }));
上述配置中的 secret
是一个用于加密 Session 数据的秘密密钥。使用 Session,您可以存储用户的状态信息,以便在不同请求之间保持用户的登录状态等。
9. 路由参数和查询参数
在 Express.js 中,路由参数和查询参数是用于从客户端请求中提取信息的两种不同方式。
- 路由参数:是 URL 路径中的一部分,通常用于传递标识符或值。在路由定义中使用冒号
:
来定义参数,然后通过req.params
对象访问它们。
app.get('/users/:id', (req, res) => { const userId = req.params.id; // 提取路由参数 });
- 查询参数:是 URL 中的键值对,通常用于筛选或过滤数据。查询参数位于 URL 的问号后面,可以使用
req.query
对象访问它们。
app.get('/search', (req, res) => { const searchTerm = req.query.q; // 提取查询参数 });
通过路由参数和查询参数,可以从客户端请求中提取特定的信息,以便在路由处理函数中进行相应的操作。
10. 处理跨域请求(CORS)
要在 Express.js 中处理跨域请求,您可以使用 cors
中间件或手动设置响应头。cors
中间件使跨域请求处理更加方便。
首先,使用 cors
中间件:
const cors = require('cors'); // 允许所有来源的跨域请求 app.use(cors()); // 或者指定特定来源 const corsOptions = { origin: '<http://example.com>', }; app.use(cors(corsOptions));
或者,手动设置响应头来允许跨域请求:
app.use((req, res, next) => { res.header('Access-Control-Allow-Origin', '<http://example.com>'); res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); next(); });
以上两种方式都可以配置 Express.js 应用程序以允许特定来源的跨域请求,并设置允许的 HTTP 方法和请求头。这有助于确保客户端可以安全地与服务器通信,而不受同源策略的限制。