文档中心

探索 DWeb 框架的无限可能,构建下一代高性能 Web 应用

中间件系统

DWeb 框架提供了强大的中间件系统,允许你在请求处理流程中插入自定义逻辑。

什么是中间件

中间件是一个函数,接收请求、响应和下一个中间件函数作为参数。中间件可以:

  • 在请求处理前执行逻辑(如身份验证、日志记录)
  • 在请求处理后执行逻辑(如响应压缩、错误处理)
  • 修改请求或响应对象
  • 终止请求处理流程

创建中间件

创建一个自定义中间件:

Code
import type { Middleware } from '@dreamer/dweb';

const myMiddleware: Middleware = async (req, res, next) => {
  // 请求前处理
  console.log('Before:', req.url);
  
  // 调用下一个中间件
  await next();
  
  // 响应后处理
  console.log('After:', res.status);
};

使用中间件

在服务器上使用中间件:

Code
import { Server } from '@dreamer/dweb';
import { logger, cors } from '@dreamer/dweb';

const server = new Server();

// 添加中间件
server.use(logger());
server.use(cors({ origin: '*' }));

server.setHandler(async (req, res) => {
  res.json({ message: 'Hello' });
});

await server.start(3000);

中间件执行顺序

中间件按照添加的顺序执行。在调用 next() 之前执行的代码会在请求处理前运行,在调用 next() 之后执行的代码会在请求处理后运行:

Code
// 中间件执行顺序示例
server.use(async (req, res, next) => {
  console.log('中间件 1: 开始');
  await next();
  console.log('中间件 1: 结束');
});

server.use(async (req, res, next) => {
  console.log('中间件 2: 开始');
  await next();
  console.log('中间件 2: 结束');
});

// 执行顺序:
// 中间件 1: 开始
// 中间件 2: 开始
// 请求处理
// 中间件 2: 结束
// 中间件 1: 结束

条件中间件

可以在特定路径上使用中间件:

Code
// 条件中间件
const authMiddleware = async (req, res, next) => {
  const token = req.headers.get('Authorization');
  if (!token) {
    res.status(401).json({ error: '未授权' });
    return;
  }
  await next();
};

// 只在特定路径使用
server.use('/api', authMiddleware);

错误处理中间件

使用中间件处理错误:

Code
// 错误处理中间件
const errorHandler = async (req, res, next) => {
  try {
    await next();
  } catch (error) {
    console.error('错误:', error);
    res.status(500).json({ 
      error: '内部服务器错误',
      message: error instanceof Error ? error.message : '未知错误'
    });
  }
};

server.use(errorHandler);

API 参考

中间件类型

Code
type Middleware = (
  req: Request,
  res: Response,
  next: () => Promise<void> | void
) => Promise<void> | void;

使用中间件

Code
// 在服务器上使用
server.use(middleware);

// 在 Application 上使用
app.use(middleware);

// 在配置文件中使用
export default {
  middleware: [
    logger(),
    cors({ origin: '*' }),
  ],
};

内置中间件

框架提供了多个内置中间件:

相关文档