Lzh on GitHub

插件

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

Nitro 插件将在服务器启动时 执行一次,以允许扩展 Nitro 的运行时行为。它们接收 nitroApp 上下文,可用于挂接到 Nitro 生命周期事件。

插件从 plugins/ 目录自动注册,并在第一次 Nitro 初始化时同步运行(按文件名顺序)。

示例:

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

如果您在其他目录中有插件,您可以使用 plugins 选项:

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

Nitro 运行时钩子

您可以使用 Nitro 钩子 来扩展 Nitro 的默认运行时行为,方法是在插件中向生命周期事件注册自定义(异步或同步)函数。

示例:

export default defineNitroPlugin((nitro) => {
  nitro.hooks.hook("close", async () => {
    // 将在 Nitro 关闭时运行
  });
})

可用钩子

请参阅 源代码 获取所有可用运行时钩子的列表。

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

示例

捕获错误

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

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

优雅关机

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

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!");
  });
})

请求和响应生命周期

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

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

渲染器响应

您可以使用插件注册一个修改 渲染器 响应的钩子。

这仅适用于使用渲染器定义的渲染处理程序,不会为其他 API/服务器路由调用。在 Nuxt 中,此钩子将为服务器端渲染页面调用。
export default defineNitroPlugin((nitro) => {

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