Schnack.js插件开发实战:打造专属的认证与通知系统
Schnack.js是一款轻量级的自托管评论系统,它允许开发者通过插件扩展其核心功能。本文将带你从零开始构建两个实用插件——自定义认证插件和邮件通知插件,通过简单的步骤让你掌握Schnack插件开发的核心技巧。## 一、Schnack插件系统快速入门Schnack的插件系统设计简洁而强大,通过[src/plugins.js](https://link.gitcode.com/i/37a7e
Schnack.js插件开发实战:打造专属的认证与通知系统
Schnack.js是一款轻量级的自托管评论系统,它允许开发者通过插件扩展其核心功能。本文将带你从零开始构建两个实用插件——自定义认证插件和邮件通知插件,通过简单的步骤让你掌握Schnack插件开发的核心技巧。
一、Schnack插件系统快速入门
Schnack的插件系统设计简洁而强大,通过src/plugins.js文件实现插件的加载与管理。系统会自动扫描配置文件中的插件列表,并通过以下两种方式加载插件:
- 本地插件:存放在src/plugins/目录下的插件,如官方提供的notify-webpush通知插件
- 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-jwt和notify-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插件吧!
更多推荐



所有评论(0)