中间件是可复用逻辑,可在 onRequest 函数之前运行。中间件通常是工具函数。错误处理、用户身份验证和日志记录是应用中常见的中间件候选场景。
中间件与标准 Pages Functions 类似,但中间件始终在项目的 /functions 目录下的 _middleware.js 文件中定义。_middleware.js 文件导出 onRequest 函数。中间件会在匹配同一 /functions 目录(含子目录)中任意 Pages Functions 的请求上运行。例如,functions/users/_middleware.js 会匹配 /functions/users/nevi、/functions/users/nevi/123 和 functions/users 的请求。
若要在整个应用(包括静态文件之前)运行中间件,请创建 functions/_middleware.js 文件。
在 _middleware.js 文件中,可导出 onRequest 处理器或其方法特定变体。以下示例中间件处理项目中 Pages Functions 抛出的任何错误。此示例使用请求处理器 context 对象中的 next() 方法:
export async function onRequest(context) {
try {
return await context.next();
} catch (err) {
return new Response(`${err.message}\n${err.stack}`, { status: 500 });
}
}可将 Pages Functions 数组导出为中间件处理器,从而串联多个要运行的中间件。以下示例处理项目 Functions 产生的任何错误,并检查用户是否已通过身份验证:
async function errorHandling(context) {
try {
return await context.next();
} catch (err) {
return new Response(`${err.message}\n${err.stack}`, { status: 500 });
}
}
function authentication(context) {
if (context.request.headers.get("x-email") != "admin@example.com") {
return new Response("Unauthorized", { status: 403 });
}
return context.next();
}
export const onRequest = [errorHandling, authentication];在上述示例中,errorHandling 函数会先运行。它会捕获 authentication 函数及后续任意 Pages Functions 中的错误。