您正在浏览 Nuxt 2 文档。前往 Nuxt 3 文档, 或了解更多关于 Nuxt 2 长期支持

中间件目录

middleware 目录包含应用程序中间件。中间件允许定义可在渲染页面或页面组(布局)之前运行的自定义函数。


共享中间件应放在 middleware/ 目录中,文件名即为中间件名称(middleware/auth.js 会成为 auth 中间件)。也可以直接使用函数定义页面特定的中间件,参见匿名中间件

中间件接收上下文 作为第一个参数。

middleware/user-agent.js
export default function (context) {
  // 向上下文添加 userAgent 属性
  context.userAgent = process.server
    ? context.req.headers['user-agent']
    : navigator.userAgent
}

在 universal 模式下,中间件在服务端(Nuxt 应用的首次请求时,例如直接访问应用或刷新页面时)调用一次,在客户端导航到其他路由时再次调用。使用 ssr: false 时,两种情况下都在客户端调用中间件。

中间件按以下顺序依次执行:

  1. nuxt.config.js(文件中的顺序)
  2. 匹配的布局
  3. 匹配的页面

路由中间件

中间件可以是异步的,返回 Promise 或使用 async/await。

middleware/stats.js
import http from 'http'

export default function ({ route }) {
  return http.post('http://my-stats-api.com', {
    url: route.fullPath
  })
}

然后在 nuxt.config.js 中使用 router.middleware 键:

nuxt.config.js
export default {
  router: {
    middleware: 'stats'
  }
}

这样每次路由变化时都会调用 stats 中间件。

也可以将中间件(多个)添加到特定布局或页面:

pages/index.vue / layouts/default.vue
export default {
  middleware: ['auth', 'stats']
}

命名中间件

通过在 middleware/ 目录中创建文件可以创建命名中间件,文件名即为中间件名称。

middleware/authenticated.js
export default function ({ store, redirect }) {
  // 如果用户未认证
  if (!store.state.authenticated) {
    return redirect('/login')
  }
}
pages/secret.vue
<template>
  <h1>Secret page</h1>
</template>

<script>
  export default {
    middleware: 'authenticated'
  }
</script>

匿名中间件

如果只需要在特定页面使用中间件,可以直接使用函数(或函数数组):

pages/secret.vue
<template>
  <h1>Secret page</h1>
</template>

<script>
  export default {
    middleware({ store, redirect }) {
      // 如果用户未认证
      if (!store.state.authenticated) {
        return redirect('/login')
      }
    }
  }
</script>
Edit this page on GitHub Updated at Tue, Apr 14, 2026