Schnack.js插件开发实战:打造专属的认证与通知系统

【免费下载链接】schnack 🗣️ Simple self-hosted node app for Disqus-like drop-in commenting on static websites 【免费下载链接】schnack 项目地址: https://gitcode.com/gh_mirrors/sc/schnack

Schnack.js是一款轻量级的自托管评论系统,它允许开发者通过插件扩展其核心功能。本文将带你从零开始构建两个实用插件——自定义认证插件和邮件通知插件,通过简单的步骤让你掌握Schnack插件开发的核心技巧。

一、Schnack插件系统快速入门

Schnack的插件系统设计简洁而强大,通过src/plugins.js文件实现插件的加载与管理。系统会自动扫描配置文件中的插件列表,并通过以下两种方式加载插件:

  1. 本地插件:存放在src/plugins/目录下的插件,如官方提供的notify-webpush通知插件
  2. NPM插件:通过npm安装的第三方插件,命名格式通常为@schnack/plugin-<plugin-id>

插件基础结构

一个标准的Schnack插件是一个返回对象的函数,接收包含应用核心组件的配置对象:

module.exports = ({ config, host, app, db, queries, events }) => {
  return {
    // 插件功能实现
  };
};

参数说明:

  • config:插件专属配置
  • app:Express应用实例
  • db:数据库连接
  • events:事件系统,用于监听评论相关事件

二、开发自定义认证插件

认证插件允许你集成第三方登录系统,我们将创建一个基于JSON Web Token的认证插件。

1. 创建插件目录结构

mkdir -p src/plugins/auth-jwt
touch src/plugins/auth-jwt/index.js

2. 实现核心认证逻辑

index.js中编写以下代码:

const jwt = require('jsonwebtoken');

module.exports = ({ config, app, events }) => {
  // 验证JWT配置
  if (!config.secret) {
    throw new Error('JWT认证插件需要配置secret');
  }

  return {
    auth: {
      // 提供登录接口
      async login(req, reply) {
        const { username, password } = req.body;
        
        // 实际项目中应该验证用户名密码
        const user = { id: '1', name: username, email: `${username}@example.com` };
        
        // 生成JWT令牌
        const token = jwt.sign(user, config.secret, { expiresIn: '24h' });
        
        reply.send({ token, user });
      },
      
      // 验证令牌中间件
      async verify(req, reply) {
        try {
          const token = req.headers.authorization?.split(' ')[1];
          if (!token) throw new Error('未提供令牌');
          
          const user = jwt.verify(token, config.secret);
          req.user = user;
          return true;
        } catch (err) {
          reply.status(401).send({ error: '认证失败' });
          return false;
        }
      }
    }
  };
};

3. 配置插件

schnack.json中添加插件配置:

{
  "plugins": {
    "auth-jwt": {
      "secret": "your-very-secure-secret-key"
    }
  }
}

三、开发邮件通知插件

当有新评论时,邮件通知插件可以及时通知网站管理员,我们将使用Nodemailer实现这一功能。

1. 创建插件文件

touch src/plugins/notify-email/index.js

2. 实现邮件发送功能

const nodemailer = require('nodemailer');

module.exports = ({ config, events }) => {
  // 创建邮件传输器
  const transporter = nodemailer.createTransport({
    host: config.smtp_host,
    port: config.smtp_port || 587,
    secure: config.smtp_secure || false,
    auth: {
      user: config.smtp_user,
      pass: config.smtp_pass
    }
  });

  return {
    notify: {
      // 监听新评论事件
      async comment_added(comment) {
        try {
          await transporter.sendMail({
            from: `"Schnack评论系统" <${config.from}>`,
            to: config.to,
            subject: '新评论通知',
            text: `您的文章"${comment.page_title}"收到了新评论:\n\n${comment.text}\n\n作者:${comment.name}`
          });
        } catch (err) {
          console.error('邮件发送失败:', err);
        }
      }
    }
  };
};

3. 配置邮件插件

{
  "plugins": {
    "notify-email": {
      "smtp_host": "smtp.example.com",
      "smtp_user": "your-email@example.com",
      "smtp_pass": "your-email-password",
      "from": "notifications@example.com",
      "to": "admin@example.com"
    }
  }
}

四、插件安装与测试

1. 安装依赖

npm install jsonwebtoken nodemailer

2. 启用插件

运行Schnack初始化命令选择需要启用的插件:

npx create-schnack

在插件选择界面,使用空格键选中我们开发的auth-jwtnotify-email插件。

3. 测试插件功能

  • 认证插件:发送POST请求到/api/auth/login测试登录功能
  • 通知插件:发表一条新评论,检查管理员邮箱是否收到通知

五、高级插件开发技巧

1. 利用事件系统

Schnack提供了丰富的事件钩子,你可以在src/events.js中查看所有可用事件:

// 评论相关事件
events.on('comment_added', comment => { /* 处理新评论 */ });
events.on('comment_approved', comment => { /* 处理已批准评论 */ });

// 用户相关事件
events.on('user_registered', user => { /* 处理新用户注册 */ });

2. 扩展数据库模型

如需存储插件特定数据,可以通过migrations/目录添加数据库迁移文件,例如创建通知订阅表:

-- 文件名: migrations/008-notification-subscriptions.sql
CREATE TABLE IF NOT EXISTS subscriptions (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  email TEXT NOT NULL,
  page_id TEXT NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

六、插件发布与分享

开发完成的插件可以发布到npm,遵循以下命名规范:

  • 官方插件:@schnack/plugin-<plugin-name>
  • 第三方插件:schnack-plugin-<plugin-name>

package.json中添加必要的元数据:

{
  "name": "@schnack/plugin-auth-jwt",
  "version": "1.0.0",
  "description": "JWT认证插件 for Schnack",
  "main": "index.js",
  "keywords": ["schnack", "schnack-plugin", "auth", "jwt"]
}

通过本文的指南,你已经掌握了Schnack插件开发的核心技术。无论是认证系统、通知服务还是内容过滤,Schnack的插件架构都能让你轻松扩展系统功能。现在就动手开发属于你的第一个Schnack插件吧!

【免费下载链接】schnack 🗣️ Simple self-hosted node app for Disqus-like drop-in commenting on static websites 【免费下载链接】schnack 项目地址: https://gitcode.com/gh_mirrors/sc/schnack

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐