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

serverMiddleware 属性

定义服务端中间件。


  • 类型: Array
    • 元素: StringObjectFunction

Nuxt 内部创建了一个 connect 实例,可以添加自定义中间件。这样可以无需外部服务器注册额外路由(通常是 /api 路由)。

connect 本身是一个中间件,因此注册的中间件在 nuxt start 和以编程方式使用(如 express-template )时都能工作。Nuxt 模块 也可以使用 this.addServerMiddleware() 提供 serverMiddleware

此外,还引入了默认为 trueprefix 选项,用于向服务端中间件添加 router base。

示例:

  • 服务端中间件路径: /server-middleware
  • Router base: /admin
  • prefix: true(默认): /admin/server-middleware
  • prefix: false: /server-middleware

服务端中间件 vs 中间件!

不要与 Vue 在每个路由之前在客户端或服务端渲染时调用的路由中间件 混淆。serverMiddleware 属性中列出的中间件在 vue-server-renderer 之前在服务端运行,可用于处理 API 请求或提供资源等服务器特定任务。

不要将服务端中间件添加到 middleware/ 目录。中间件会被 webpack 打包到生产 bundle 中,并在 beforeRouteEnter 中运行。将 serverMiddleware 添加到 middleware/ 目录会导致 Nuxt 错误地将其选为中间件,从而向 bundle 添加错误的依赖项或产生错误。

用法

如果中间件是字符串,Nuxt 会自动解析并引入它。

nuxt.config.js
import serveStatic from 'serve-static'

export default {
  serverMiddleware: [
    // 注册 redirect-ssl npm 包
    'redirect-ssl',

    // 从项目的 server-middleware 目录注册文件以处理 /server-middleware/* 请求
    { path: '/server-middleware', handler: '~/server-middleware/index.js' },

    // 也可以创建自定义实例
    { path: '/static2', handler: serveStatic(__dirname + '/static2') }
  ]
}
如果不想在所有路由上注册中间件,必须使用带特定路径的对象形式,否则 nuxt 的默认处理器将无法工作。

自定义服务端中间件

也可以创建自定义中间件,详情请参阅 Connect 文档

中间件(server-middleware/logger.js):

server-middleware/logger.js
export default function (req, res, next) {
  // req 是 Node.js HTTP 请求对象
  console.log(req.url)

  // res 是 Node.js HTTP 响应对象

  // next 是调用下一个中间件的函数
  // 如果中间件不是端点,不要忘记在函数末尾调用 next!
  next()
}
nuxt.config.js
serverMiddleware: ['~/server-middleware/logger']

自定义 API 端点

服务端中间件也可以扩展 Express,这样可以创建 REST 端点。

server-middleware/rest.js
const bodyParser = require('body-parser')
const app = require('express')()

app.use(bodyParser.json())
app.all('/getJSON', (req, res) => {
  res.json({ data: 'data' })
})

module.exports = app
nuxt.config.js
serverMiddleware: [
  { path: "/server-middleware", handler: "~/server-middleware/rest.js" },
],

对象语法

如果服务端中间件由映射到路径的函数列表组成:

export default {
  serverMiddleware: [
    { path: '/a', handler: '~/server-middleware/a.js' },
    { path: '/b', handler: '~/server-middleware/b.js' },
    { path: '/c', handler: '~/server-middleware/c.js' }
  ]
}

也可以通过传递对象来定义:

export default {
  serverMiddleware: {
    '/a': '~/server-middleware/a.js',
    '/b': '~/server-middleware/b.js',
    '/c': '~/server-middleware/c.js'
  }
}
Edit this page on GitHub Updated at Tue, Apr 14, 2026