答案
Whistle 支持插件系统,可以通过开发插件来扩展其功能,实现自定义的网络请求处理逻辑。
插件开发基础
1. 创建插件项目
bashmkdir whistle-plugin-demo cd whistle-plugin-demo npm init -y
2. 创建插件入口文件
创建 index.js 文件:
javascriptmodule.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. 请求拦截和修改
javascriptmodule.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. 响应拦截和修改
javascriptmodule.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. 中间件模式
javascriptmodule.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 }); }); };
插件配置选项
javascriptmodule.exports = function(server, options) { // 获取插件配置 const customConfig = options.customConfig || {}; const port = options.port || 3000; console.log('Plugin options:', options); };
安装和使用插件
1. 本地安装插件
bashcd whistle-plugin-demo npm link w2 install demo
2. 全局安装插件
bashnpm install -g whistle-plugin-demo w2 install demo
3. 在规则中使用插件
shellwww.example.com plugin://demo
高级功能
1. WebSocket 支持
javascriptmodule.exports = function(server, options) { server.on('upgrade', function(req, socket, head) { // 处理 WebSocket 升级请求 console.log('WebSocket upgrade:', req.url); }); };
2. 文件系统操作
javascriptconst 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. 数据库集成
javascriptconst 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)); } }); } }); };
最佳实践
-
错误处理
- 添加适当的错误处理逻辑
- 记录错误日志
- 提供友好的错误信息
-
性能优化
- 避免阻塞操作
- 使用缓存减少重复计算
- 合理使用异步操作
-
安全性
- 验证输入参数
- 防止注入攻击
- 敏感信息加密存储
-
文档和测试
- 编写清晰的使用文档
- 添加单元测试
- 提供示例代码