我用npx create-next-app@latest --typescript创建了一个全新的Next.js.安装后(版本为13.3.4),在没有更改任何文件的情况下,我在src文件夹中添加了一个新的middleware.ts文件,我只放了这段代码:

import type { NextRequest } from "next/server";
import { NextResponse } from "next/server";

export function middleware(request: NextRequest) {
  console.log("request", request.nextUrl.pathname);
  return NextResponse.next();
}

// EDIT: By putting this block will get expected result.
export const config = {
  matcher: [
    /*
     * Match all request paths except for the ones starting with:
     * - api (API routes)
     * - _next/static (static files)
     * - _next/image (image optimization files)
     * - favicon.ico (favicon file)
     */
    '/((?!api|_next/static|_next/image|favicon.ico).*)',
  ],
};

控制台日志(log)被多次命中.我觉得应该只有一次,对吧?对于这个全新的Next.js安装,我需要做什么配置吗?

注意:我将在middleware中执行一些用于身份验证的Cookie逻辑.屏幕截图:

enter image description here

推荐答案

这是正常的,因为默认情况下,middleware针对每个请求运行,包括用于获取assets资源 的请求,如Java Scritp、CSS和图像文件.正如你在doc号公路上看到的那样:

中间件将被调用every route in your project美元.执行顺序如下:

  1. next.config.js增加到headers
  2. next.config.js增加到redirects
  3. 中间件(rewritesredirects等)
  4. beforeFiles(rewrites)从next.config.js
  5. 文件系统路由(public/_next/static/pages等)
  6. afterFiles(rewrites)从next.config.js
  7. 动态路由(/blog/[slug])
  8. fallback(rewrites)从next.config.js

如果您登录request.nextUrl.pathname,您将看到它运行的不同路径.要使其仅对某些路径执行,您需要使用conditional statementsmatcher对象,如下所示:

import type { NextRequest } from "next/server";
import { NextResponse } from "next/server";

export function middleware(request: NextRequest) {
  console.log("request", JSON.stringify(request));
  return NextResponse.next();
}

// The above middleware would only run for the "/" path
export const config = {
  matcher: '/',
}

Javascript相关问答推荐

设置默认值后动态更新japbox或调色板

Flisk和JS错误:未捕获的Syntax错误:意外的令牌'<'

布局样式在刷新时不持续

如何在表格上拥有水平滚动条,在正文页面上拥有垂直滚动条,同时还对html表格的标题使用位置粘性?

Snowflake JavaScript存储过程返回成功,尽管预期失败

CheckBox作为Vue3中的一个组件

无法从NextJS组件传递函数作为参数'

第二次更新文本输入字段后,Reaction崩溃

在SHINY R中的嵌套模块中,不能使用Java代码

令牌JWT未过期

try 将Redux工具包与MUI ToggleButtonGroup组件一起使用时出错

JavaScript:如果字符串不是A或B,则

如何使本地html页面在重新加载时保持当前可隐藏部分的打开状态?

如何根据查询结果重新排列日期

Clip-Path在网页浏览器(Mozilla、Edge、Chrome)上不能正常工作,但在预览版Visual Code Studio HTML、CSS、JS上却能很好地工作

Pevent触发material 用户界面数据网格中的自动保存

react 路由如何使用从加载器返回的数据

Plotly.js栏为x轴栏添加辅助文本

将字符串解释为数字;将其重新编码为另一个基数

找不到处于状态的联系人