serverMiddleware 属性
定义服务端中间件。
-
类型:
Array-
元素:
String或Object或Function
-
元素:
Nuxt 内部创建了一个 connect 实例,可以添加自定义中间件。这样可以无需外部服务器注册额外路由(通常是 /api 路由)。
connect 本身是一个中间件,因此注册的中间件在 nuxt start 和以编程方式使用(如 express-template )时都能工作。Nuxt 模块 也可以使用 this.addServerMiddleware() 提供 serverMiddleware。
此外,还引入了默认为 true 的 prefix 选项,用于向服务端中间件添加 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