Express.js中间件Middleware是处理 HTTP 请求和响应以及jwt token认证

中间件(Middleware)是处理 HTTP 请求和响应的核心概念,可以处理请求的认证或者响应结果的包装等功能,例如注册登录接口不需要中间件认证,但是其他的接口都需要jwt token认证,这里就可以使用中间件分组api路由接口,实现部分接口需要认证,部分接口不需要认证。

基本中间件示例

javascript 复制代码
const express = require('express');
const app = express();

// 最简单的中间件
app.use((req, res, next) => {
    console.log(`${req.method} ${req.url}`);
    next(); // 必须调用 next() 传递给下一个中间件
});

// 路由处理
app.get('/', (req, res) => {
    res.send('Hello World');
});

app.listen(3000);

应用级别中间件

javascript 复制代码
// 应用到所有路由
app.use((req, res, next) => {
    console.log('Time:', Date.now());
    next();
});

// 应用到特定路径
app.use('/user', (req, res, next) => {
    console.log('User middleware');
    next();
});

// 多个中间件函数
app.use('/api', 
    (req, res, next) => {
        console.log('First middleware');
        next();
    },
    (req, res, next) => {
        console.log('Second middleware');
        next();
    }
);

路由级别中间件

javascript 复制代码
const router = express.Router();

router.use((req, res, next) => {
    console.log('Router middleware');
    next();
});

router.get('/', (req, res) => {
    res.send('Router home');
});

app.use('/admin', router);

如果需要部分接口需要认证,部分接口不需要token认证,就可以使用路由中间件将他们分开,例如认证中间件的代码:

javascript 复制代码
import { Request, Response, NextFunction } from 'express';
import { env } from 'cloudflare:workers';
import { verifyJWT } from '../utils/auth';

export async function authMiddleware(req: Request, res: Response, next: NextFunction) {
	const auth = req.headers.authorization;

	if (!auth || !auth.startsWith('Bearer ')) {
		return res.status(401).json({ error: 'Unauthorized' });
	}

	// get token from header
	const token = auth.slice(7);

	try {
		const payload = await verifyJWT(token, env.JWT_SECRET);
		// middleware
		req.user = {
			id: payload.id,
			email: payload.email,
		};
		// next middleware
		next();
	} catch {
		return res.status(401).json({ error: 'Invalid token' });
	}
}

将路由分开为注册登录和其他的路由文件:

在需要认证的路由中使用认证中间件:

这样做的话,这个路由文件中的路由就都需要经过token认证才可以访问:

相关推荐
Wx-bishekaifayuan10 小时前
springboot桂味美食分享系统40540-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
程序员梅雨11 小时前
ZooKeeper面经总结
java·大数据·linux·分布式·后端·zookeeper·中间件
郝亚军12 小时前
RK3562 中有 mosquitto、nginx 了,还需要 http,ftp,tftp 等协议吗?
运维·nginx·http
是个西兰花15 小时前
http讲解
网络·网络协议·http
菜鸟阿达19 小时前
我把 API 调试工具做成了浏览器版“Postman“,开源了:HTTP/SSE/WebSocket 全能测
http·开源·postman
2501_9378609421 小时前
HTTP/HTTPS 学习笔记(中):报头、Cookie、状态码与请求构造
学习·http·https
CCblandy1 天前
HTTP 长连接 3 类故障实测:[WinError 10053]、99 个 TIME_WAIT、69 次多余握手,4 种对策怎么选
后端·python·网络协议·http·云原生·性能优化·架构
隐擎fox2 天前
深入 QUIC 与 HTTP/3 协议栈特征:新一代 UDP 流量风控识别与网络防关联工程实战
网络·http·udp
Wx-bishekaifayuan2 天前
express皖美特色农产品网售系统53118-计算机课程设计、毕业设计
人工智能·spring boot·后端·python·课程设计·express·旅游