中间件
中间件是一个函数,它接收一个包含请求的上下文对象,并返回一个响应。中间件通常用于设置 HTTP 标头、测量响应时间或获取数据并将其传递给另一个中间件。
tsx
const app = new App<{ greeting: string }>()
.use((ctx) => {
// Middleware to pass data
ctx.state.greeting = "Hello world";
return ctx.next();
})
.use(async (ctx) => {
// Middleware to add a HTTP header
const res = await ctx.next();
res.headers.set("server", "fresh server");
return res;
})
// A handler is a form of middleware that responds. Here we
// render HTML and return it.
.get("/", (ctx) => {
return ctx.render(<h1>{ctx.state.greeting}</h1>);
});中间件可以按您想要的方式链接和组合。它们是在服务器上使 HTTP 相关逻辑可复用的绝佳方式。
中间件辅助函数
使用 define.middleware() 辅助函数来获取开箱即用的类型定义:
ts
import { define } from "../utils.ts";
const middleware = define.middleware(async (ctx) => {
console.log("my middleware");
return await ctx.next();
});内置中间件
Fresh 自带以下内置中间件:
- cors() - 设置 CORS HTTP 标头
- csrf() - CSRF 保护
- csp() - 内容安全策略标头
- trailingSlashes() - 强制尾部斜杠
基于文件系统路由的中间件
通过基于文件系统路由,您可以在 routes/ 文件夹或其任何子文件夹中的 _middleware.ts 文件中定义中间件。
ts
import { define } from "../utils.ts";
export default define.middleware(async (ctx) => {
console.log("my middleware");
return await ctx.next();
});您也可以导出一个中间件数组:
ts
import { define } from "../utils.ts";
const middleware1 = define.middleware(async (ctx) => {
console.log("A");
return await ctx.next();
});
const middleware2 = define.middleware(async (ctx) => {
console.log("B");
return await ctx.next();
});
export default [middleware1, middleware2];