Core · 框架 · HTTP 与 API

中间件

中间件处理多个接口共用的请求行为,例如身份解析、请求约束和响应头。它应围绕明确的路径与顺序注册,业务流程仍留在服务中。

声明与接入

TypeScript
import { defineHttpMiddleware } from '@nocobase/app-server/router';

export const responseHeaders = defineHttpMiddleware({
  name: 'example.response-headers',
  register(router) {
    router.use('/api/*', async (context, next) => {
      await next();
      context.header('X-Content-Type-Options', 'nosniff');
    });
  },
});

在应用组装阶段调用 app.addHttpMiddleware(responseHeaders);应在应用启动和路由注册之前完成。插件也可以在允许注册贡献的阶段接入自身中间件。

注册回调收到应用根 Router,因此 /api/* 是相对于应用的路径。宿主负责外部基础路径适配。仅作用于一个路由模块的逻辑,可以直接在该模块返回的 Hono Router 上使用 use()。

执行顺序

中间件先执行 await next() 前的代码,后续处理器结束后再执行其后的代码。需要拒绝请求时直接返回响应或抛框架 API 错误,不再调用后续处理器。

身份必须先于依赖身份的授权检查。避免读取请求体后又让下游按另一种方式重复消费,尤其是流式上传;需要共享的解析结果可通过明确的上下文契约传递。

限制与异常

通用请求大小、超时和限流可通过 api 配置统一设置。进程内限流计数不是多实例全局计数,反向代理后的客户端地址也要按实际部署核对。

中间件不应把未知异常包装成成功响应。日志记录请求标识、耗时和结果,避免记录 Cookie、Authorization 或完整敏感请求体。

测试应覆盖匹配与不匹配路径、拒绝时不继续执行、异常响应和多中间件顺序。见请求校验与配置项参考。

接口与实现

NocoBase 文档助手

关于 NocoBase,你想了解什么?

每次提问独立回答,不会参考之前的问答。请提供完整背景。