教程 fastify tutorial

插件编写与注册

Fastify 插件机制允许你将功能模块化,实现代码复用、作用域隔离与配置注入。插件可以封装路由、装饰器、中间件、钩子等逻辑。

编写基本插件

Fastify 插件本质是一个函数,接收两个参数:fastify 实例与 options 配置对象。

js
// hello-plugin.js
async function helloPlugin(fastify, options) {
  fastify.get('/hello', async () => {
    return { msg: `Hello ${options.name}` };
  });
}

module.exports = helloPlugin;

注册插件

在主程序中使用 register() 方法注册插件,并传入配置项:

js
const fastify = require('fastify')();

fastify.register(require('./hello-plugin'), { name: 'Fastify' });

fastify.listen({ port: 3000 });

访问 /hello 会返回:

json
{ "msg": "Hello Fastify" }

使用 fastify-plugin 显式声明插件

为确保插件可以被其他插件访问,推荐使用 fastify-plugin:

bash
npm install fastify-plugin
js
// hello-plugin.js
const fp = require('fastify-plugin');

async function helloPlugin(fastify, options) {
  fastify.decorate('sayHi', () => `Hi, ${options.name}`);
}

module.exports = fp(helloPlugin);

注册后即可在其他地方访问 fastify.sayHi()。

同步插件

虽然推荐使用 async 函数,Fastify 也支持同步插件写法:

js
function syncPlugin(fastify, options, done) {
  fastify.decorate('x', 123);
  done();
}

module.exports = syncPlugin;

注册时使用 .register(syncPlugin) 即可。

插件内部注册子插件

插件可以嵌套注册其他插件,实现模块组合:

js
async function parentPlugin(fastify) {
  fastify.register(async function child(fastify) {
    fastify.get('/child', async () => 'from child');
  });
}

module.exports = parentPlugin;

设置作用域与隔离

默认插件是作用域隔离的,除非使用 fastify-plugin 显式暴露。

示例:

js
// a-plugin.js
fastify.decorate('aaa', '123'); // 默认只在当前插件中可见

其他插件访问不到 aaa,除非通过 fastify-plugin 注册为全局插件。

插件文件结构建议

为保持项目整洁,可将插件放置于独立目录:

bash
src/
├── plugins/
│   ├── db.js
│   └── auth.js

注册:

js
fastify.register(require('./plugins/db'));
fastify.register(require('./plugins/auth'));

每个插件都应专注于单一职责,便于管理与测试。