插件 Plugins

使用插件来扩展 Nitro 的运行时行为。

Nitro 插件将在服务器启动期间执行一次,以允许扩展 Nitro 的运行时行为。 它们接收 nitroApp 上下文,可用于挂接 Nitro 生命周期事件。 插件从 plugins/ 目录自动注册,并在第一次 Nitro 初始化时同步运行(按文件名顺序)。

例如:

ts
// plugins/test.ts
export default defineNitroPlugin((nitroApp) => {
  console.log('Nitro plugin', nitroApp)
})

如果您在另一个目录中有插件,则可以使用plugins选项:

ts
nitro.config.ts
ts
export default defineNitroConfig({
  plugins: ['my-plugins/hello.ts']
})

运行时钩子

您可以使用 Nitro hooks 通过将自定义 (async 或 asnc) 函数注册到插件内的生命周期事件来扩展 Nitro 的默认运行时行为。

例如:

ts
export default defineNitroPlugin((nitro) => {
  nitro.hooks.hook('close', async () => {
    // Will run when nitro is being closed
  })
})

可用的钩子

查看源代码以获取所有可用运行时挂钩的列表。

  • "close", () => {}
  • "error", (error, { event? }) => {}
  • "render:response", (response, { event }) => {}
  • "request", (event) => {}
  • "beforeResponse", (event, { body }) => {}
  • "afterResponse", (event, { body }) => {}

示例

捕获错误

您可以使用插件来捕获所有应用程序错误。

ts
export default defineNitroPlugin((nitro) => {
  nitro.hooks.hook('error', async (error, { event }) => {
    console.error(`${event.path} Application error:`, error)
  })
})

优雅关闭

您可以使用插件来注册一个在 Nitro 关闭时解析的钩子。

ts
export default defineNitroPlugin((nitro) => {
  nitro.hooks.hookOnce('close', async () => {
    // 当 nitro 关闭时将运行
    console.log('Closing nitro server...')
    await new Promise(resolve => setTimeout(resolve, 500))
    console.log('Task is done!')
  })
})

请求和响应生命周期

您可以使用插件来注册一个可以在请求生命周期上运行的钩子:

ts
export default defineNitroPlugin((nitroApp) => {
  nitroApp.hooks.hook('request', (event) => {
    console.log('on request', event.path)
  })

  nitroApp.hooks.hook('beforeResponse', (event, { body }) => {
    console.log('on response', event.path, { body })
  })

  nitroApp.hooks.hook('afterResponse', (event, { body }) => {
    console.log('on after response', event.path, { body })
  })
})

渲染器响应

您可以使用插件来注册一个修改 renderer 响应的钩子。

仅适用于 使用 renderer 定义的渲染处理程序,不会被其他 api/server 路由调用。 在 Nuxt 中,此钩子将被调用用于服务器端渲染页面

ts
export default defineNitroPlugin((nitro) => {
  nitro.hooks.hook('render:response', (response, { event }) => {
    // 在此处检查或修改渲染器响应
    console.log(response)
  })
})