为什么 Next.js 中间件会多次运行?

2023-11-29

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

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();
}

控制台日志被多次点击。我想应该是一次吧?对于这个新的 Next.js 安装,我需要做任何配置吗?

注意:我将在此处执行一些 cookie 逻辑中间件用于身份验证。截屏:

enter image description here


这是正常的,因为middleware默认情况下,每个请求都会运行,包括获取 JavaScript、CSS 和图像文件等资源的请求。正如您可以在doc:

中间件将被调用您项目中的每条路线。以下是执行顺序:

  1. headers from next.config.js
  2. redirects from next.config.js
  3. 中间件 (rewrites, redirects, etc.)
  4. beforeFiles (rewrites) from next.config.js
  5. 文件系统路由(public/, _next/static/, pages, etc.)
  6. afterFiles (rewrites) from next.config.js
  7. 动态路线(/blog/[slug])
  8. fallback (rewrites) from next.config.js

如果您添加一个console.log(request.nextUrl.pathname),您会看到它运行的不同路径。要让它仅对某些路径执行,您需要使用条件语句 or the matcher配置,像这样:

// middleware.ts

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

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

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

另一种经常使用的匹配模式是:

// middleware.ts

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

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

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).*)',
  ],
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Next.js 中间件会多次运行? 的相关文章

  • 如何在没有 jQuery 的情况下删除 Javascript 中的元素

    我试图通过以下方式从 DOM 中删除 Div a 标签嵌套在其中 我想我正在寻找的是 jQuery 的纯 Javascript 版本 div remove 这是html设置 div a href Click me to remove the
  • jQuery .push 到 .get 调用中的数组给出空结果

    谁能告诉我为什么下面给我一个空字符串 当我console log contentArray in the get 回调函数它显示数据 但是当我尝试在下面的代码中执行它时 结果为空 sectionArray contentArray func
  • Number.IsNaN() 比 isNaN() 更糟糕吗

    Soooooo isNaNJavaScript 显然被破坏了 比如 isNaN isNaN isNaN true isNaN false isNaN 0 返回 false 当它们看起来都是 不是数字 在 ECMAScript 6 中 草案包
  • 如何在React Native Android中获取响应头?

    您好 我想在获取 POST 请求后获取响应标头 我尝试调试看看里面有什么response with console log response 我可以从以下位置获取响应机构responseData但我不知道如何获取标题 我想同时获得标题和正文
  • 本地推送通知到在应用程序内运行 JS 代码的 Win8 Live Tile

    我正在尝试将更新发送到我的应用程序的磁贴 当应用程序运行时 这可以正常工作 例如 当用户单击按钮时 我可以轻松地将磁贴更新通知发送到磁贴 我无法解决的是当应用程序无法运行时如何更新磁贴 我找到的唯一选择是使用以下命令从远程 Web 服务器拉
  • 导航栏下拉菜单(折叠)在 Bootstrap 5 中不起作用

    我在尝试使用以下命令创建响应式菜单或下拉按钮时遇到问题Bootstrap 5一切似乎都正常 导航图标和下拉图标出现 但它不起作用 当我单击nav图标或dropdown按钮 无dropdown menu apears 我想特别提到的是 我还包
  • 如何使用 Greasemonkey 监视静态 HTML 页面的更改?使用哈希?

    我希望我的 Greasemonkey 脚本仅在其访问的静态页面具有与以前完全相同的内容时运行 现在我可以设置一个包含该页面哈希的变量 我正在寻找一种动态散列页面的方法 以便我可以将我的散列与生成的散列进行比较 关于如何即时实现散列的任何想法
  • React autoFocus 将光标设置为输入值的开头

    我有一个受控输入 最初显示一个值 我已将该输入设置为自动聚焦 但当我希望它出现在末尾时 光标出现在输入的开头 我知道这可能是因为自动对焦是在值之前添加的 但我不能 100 确定 在输入字段末尾完成光标初始化的最佳方法是什么 var Test
  • React Router v4 不渲染组件

    React Router v4 渲染组件存在问题 在应用程序初始加载时 它将呈现与 URL 相对应的正确组件 但是 任何后续的组件Link单击不会呈现所需的组件 图书馆 反应路由器 4 2 2 https reacttraining com
  • JavaScript RegEx:不同的结果:使用字符串和使用正则表达式“文字”构建模式?

    使用 RegExp 文字与字符串之间有什么区别吗 http jsfiddle net yMMrk http jsfiddle net yMMrk String prototype lastIndexOf function pattern p
  • 如何正确取消引用然后删除 JavaScript 对象?

    我想知道从内存中完全取消引用 JavaScript 对象的正确方法 确保删除时不会在内存中悬空 并且垃圾收集器会删除该对象 当我看这个问题时在 JavaScript 中删除对象 https stackoverflow com questio
  • 如何计算特定字符在字符串中出现的次数

    我正在尝试创建一个函数来查看数组中的任何字符是否在字符串中 如果是 有多少个 我尝试计算每一种模式 但是太多了 我尝试使用 Python 中的 in 运算符的替代方案 但效果不佳 function calc fit element var
  • 改变 JavaScript 中的顶部填充

    以下是我在 css 中设置顶部填充的方法 body font size font size px margin 0 padding 100px 0 20px 0 width 100 important 如何使用最简单的 javascript
  • 表单发布请求并存储收到的数据

    我有一个非常简单的表单 在提交时发出发布请求
  • 聆听 Angular 2 中的元素可见性

    我正在为我的网络应用程序使用 Bootstrap 和 Angular 2 v4 我想监听指令中的元素以了解可见性变化 我的元素有一个可以隐藏其子元素的父元素hidden sm up我需要在每次隐藏或显示时触发一个函数 div hidden
  • 使用javascript动态更新css内容

    需要将 css 更新为动态值 我不确定最好的方法是什么 div style zoom 1 div 缩放级别将根据窗口大小调整触发 应用程序将相应缩放 我将此应用程序加载到 cordova 中并让它在 iPAD 中运行 然后我意识到需要使用
  • Highcharts jQuery 渲染问题 - 所有浏览器

    我在尝试使用构建堆积柱形图时遇到了一个奇怪的问题高图表 http www highcharts com 当图表呈现时 在您调整浏览器大小之前 不会显示列无论如何 导致图表重绘 我认为 图表的其余部分显示 轴 标题等 但不显示列本身 我在 I
  • 如何从 json 文件创建模型? (ExtJS)

    这是我想使用 json 文件创建的模型 Ext define Users extend Ext data Model fields name user id type int name user name type string 为了根据服
  • 仅当显式选择行时才关闭 ui-bootstrap typeahead

    我创建了这个jsBin http jsbin com livuqafe 2 edit来证明我遇到的问题 如果您转到此处 请尝试输入 五 并继续 你的自然反应是输入 五 然后按 Tab 如果你想要 五百 你可以向下箭头一次 但是 在这种情况下
  • 如何通过索引访问 JSON 对象中的字段

    我知道这不是最好的方法 但我别无选择 我必须通过索引访问 JSONObject 中的项目 访问对象的标准方法是只写this objectName or this objectName 我还找到了一种获取 json 对象内所有字段的方法 fo

随机推荐

  • 参与者数量为奇数的每周小组分配算法

    问题有一个循环解决方案我之前问过 它对于偶数的人来说效果很好 但是一旦你实现了算法并尝试了它们 这些建议似乎都不起作用 我已经尝试了很多变化并且 将最后一个与一大堆其他人分组 第二组最后一组 不同的组合 2和4到底行的最后一个 我认为这会给
  • 检索 Matplotlib 热图颜色

    我正在尝试检索 matplotlib 热图上每个单元格的颜色 该热图由imshow 功能 例如由magic function below import matplotlib pyplot as plt import numpy as np
  • 如何使用 javascript d3 打开 json 文件?

    我正在尝试使用 javascript 从 JSON 文件中提取元素 但是收到一条错误消息 指出它无法加载 JSON 文件 这就是我的代码的样子
  • 异步nodejs执行顺序

    processItem什么时候开始执行 是否在某些项目被推入队列后立即开始 或者 for 循环必须在队列中的第一项开始执行之前完成 var processItem function item callback console log ite
  • 将列插入 pandas 数据框

    设想 我有一段代码 可以将 Excel 工作表中的数据读取到数据框中 合并到一个数据框中 并执行一些清理过程 Issue 我试图使用 pd insert 将具有给定值的列添加到数据帧的开头 但每次运行此行时 数据帧都会从变量资源管理器中消失
  • 从 Facebook API 将数据插入 Meteor

    我按照给出的例子here从 FB Graph 中提取数据 到目前为止 我已经设法从 FB 中提取数据 但我不知道如何将其插入到 MongoDB 中 目前 Facebook 的数据呈现如下 data picture https photo j
  • 将 Ajax 与 jQuery DataTables 结合使用时,如何确定如何处理返回的数据?

    像许多其他人一样 我查看类似问题的各种答案 在网上搜索示例等 但除非我碰巧找到我遇到的几乎相同的情况 否则我无法弄清楚如何让 DataTable 填充阿贾克斯呼叫 我认为如果有人能够解释所发生的步骤以及如何使用 DataTables 的 A
  • 按字典顺序查找排列列表中给定排列的索引[重复]

    这个问题在这里已经有答案了 可能的重复 给定一个字符串和该字符串的排列 在字符串排列的排序列表中查找该排列字符串的索引 这是一道面试题 假设有一个按字典顺序排列的排列列表 例如 123 132 213 231 312 321 给定一个排列
  • 两种不同的交换功能有什么区别?

    我想知道两种代码在性能上的区别 有什么优点和缺点 Code 1 temp a a b b temp Code 2 a a b b a b a a b 第一种技术的优点是它是一个通用的习语 明显且正确 它适用于任何地方 任何类型的变量 它很可
  • 涉及 SUM、LEFT JOIN 和 GROUP BY 的重复

    我遇到了涉及 SUM LEFT OUTER JOIN 和 GROUP BY 命令的问题 但无法找出错误所在 我有两张表 一张用于客户交易 一张用于客户索赔 客户可以有多个交易和多个索赔 但在两个表中 行都是唯一的 客户也不能提出索赔 交易表
  • 错误地使用了当前工作目录...我的数据库到底在哪里?

    我知道为 SQLite 数据库设置数据库名称意味着设置 DB 文件的路径 我这样设置 db setDatabaseName DienstplanerDB sqlite 这是错误的 事情不是这样的 但我做到了 不知怎的 它起作用了 但我无法通
  • 滚动视图内的RelativeLayout不滚动

    我尝试用滚动视图包装我的相对布局以在横向模式下使用 但它不起作用 我还尝试用 Linearlayout 包装我的相对布局 但它也不起作用 这是将relativelayout包装在scrollview中的xml
  • JSON 字符编码

    我的 Java Web 应用程序提交一个返回 JSON 的 AJAX 请求 如下所示 value a riennes 当 a riennes 在网页中显示时 它显示为 a riennes 所以我猜测存在某种字符编码问题 AJAX 响应标头包
  • 字符串编码 TextView.setText()

    在 TextView 中设置文本时 无法正确解释字符 这是我的代码 TextView tv new TextView context String s byte bytes s dgse eT41 bytes s getBytes ISO
  • 使用默认实现的空安全映射比较器

    Java 8 中是否可以内置创建空安全映射比较器 而无需编写自己的实现Comparator 运行以下代码时 会导致 NPE 因为keyExtractor的论证Comparator comparing 可能会返回一个null value pu
  • omp 中的“C6993:代码分析忽略 OpenMP 构造”是什么意思?

    我将 omp 与 Visual Studio 2019 和 C 一起使用 但它一直给我提示 C6993 代码分析忽略 OpenMP 这是否意味着 omp 将在单线程中运行该程序 为什么 以下是代码 我测量了添加 omp 之前和之后的时间 它
  • 如何将整个窗口移动到屏幕上的某个位置(Tkinter,Python3)

    标题说明了一切 如何使用 tkinter 将整个窗口移动到屏幕上的某个位置 这应该是移动根框架 Use the geometry根 或任何顶级 窗口的方法 例如 import tkinter as tk root tk Tk root ge
  • 即使处理了被拒绝的承诺,仍收到“UnhandledPromiseRejectionWarning”

    我构建了一个迭代的函数Generator包含同步代码和Promises module exports isPromise value return typeof value object value null then in value r
  • 可以“使用严格”警告而不是错误

    使用时use strictperl 将在不安全的构造上生成运行时错误 现在我想知道是否可以让它只打印警告而不导致运行时错误 或者是use warnings 或 w 关于相同问题的警告 No use strict无法发出警告而不死 它所做的只
  • 为什么 Next.js 中间件会多次运行?

    我创建了一个新鲜的Next js using npx create next app latest typescript 安装后 版本为13 3 4 在不更改任何文件的情况下 我添加了一个新的middleware ts文件内的src文件夹