乐闻世界logo
搜索文章和话题

如何开发 whistle 插件,插件的基本结构是什么?

2月21日 16:26

答案

Whistle 支持插件系统,可以通过开发插件来扩展其功能,实现自定义的网络请求处理逻辑。

插件开发基础

1. 创建插件项目

bash
mkdir whistle-plugin-demo cd whistle-plugin-demo npm init -y

2. 创建插件入口文件

创建 index.js 文件:

javascript
module.exports = function(server, options) { // 插件初始化逻辑 console.log('Whistle plugin demo loaded'); // 监听请求事件 server.on('request', function(req, res) { // 处理请求 if (req.url === '/api/plugin-demo') { res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ message: 'Hello from whistle plugin', timestamp: Date.now() })); } }); // 监听响应事件 server.on('response', function(req, res) { // 处理响应 console.log('Response:', req.url, res.statusCode); }); };

3. 配置 package.json

json
{ "name": "whistle-plugin-demo", "version": "1.0.0", "description": "A demo whistle plugin", "main": "index.js", "whistleConfig": { "name": "demo", "description": "Demo plugin for whistle" } }

插件功能实现

1. 请求拦截和修改

javascript
module.exports = function(server, options) { server.on('request', function(req, res) { // 修改请求头 req.headers['X-Custom-Header'] = 'Custom Value'; // 记录请求信息 console.log('Request URL:', req.url); console.log('Request Method:', req.method); console.log('Request Headers:', req.headers); }); };

2. 响应拦截和修改

javascript
module.exports = function(server, options) { server.on('response', function(req, res) { // 修改响应头 res.setHeader('X-Response-Header', 'Custom Response'); // 修改响应体 const originalEnd = res.end; res.end = function(chunk, encoding) { if (chunk) { const body = chunk.toString(); const modifiedBody = body.replace(/old/g, 'new'); originalEnd.call(res, modifiedBody, encoding); } else { originalEnd.call(res, chunk, encoding); } }; }); };

3. 中间件模式

javascript
module.exports = function(server, options) { // 使用 Express 风格的中间件 server.use(function(req, res, next) { console.log('Middleware:', req.url); next(); }); // 路由处理 server.get('/api/test', function(req, res) { res.json({ success: true }); }); };

插件配置选项

javascript
module.exports = function(server, options) { // 获取插件配置 const customConfig = options.customConfig || {}; const port = options.port || 3000; console.log('Plugin options:', options); };

安装和使用插件

1. 本地安装插件

bash
cd whistle-plugin-demo npm link w2 install demo

2. 全局安装插件

bash
npm install -g whistle-plugin-demo w2 install demo

3. 在规则中使用插件

shell
www.example.com plugin://demo

高级功能

1. WebSocket 支持

javascript
module.exports = function(server, options) { server.on('upgrade', function(req, socket, head) { // 处理 WebSocket 升级请求 console.log('WebSocket upgrade:', req.url); }); };

2. 文件系统操作

javascript
const fs = require('fs'); const path = require('path'); module.exports = function(server, options) { server.on('request', function(req, res) { if (req.url === '/api/file') { const filePath = path.join(__dirname, 'data.json'); const data = fs.readFileSync(filePath, 'utf8'); res.end(data); } }); };

3. 数据库集成

javascript
const mysql = require('mysql'); module.exports = function(server, options) { const connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'password', database: 'test' }); server.on('request', function(req, res) { if (req.url === '/api/users') { connection.query('SELECT * FROM users', function(error, results) { if (error) { res.statusCode = 500; res.end(JSON.stringify({ error: error.message })); } else { res.end(JSON.stringify(results)); } }); } }); };

最佳实践

  1. 错误处理

    • 添加适当的错误处理逻辑
    • 记录错误日志
    • 提供友好的错误信息
  2. 性能优化

    • 避免阻塞操作
    • 使用缓存减少重复计算
    • 合理使用异步操作
  3. 安全性

    • 验证输入参数
    • 防止注入攻击
    • 敏感信息加密存储
  4. 文档和测试

    • 编写清晰的使用文档
    • 添加单元测试
    • 提供示例代码
标签:Whistle