独立运行testcafe-hammerhead Proxy时,如何配置请求钩子?
独立运行testcafe-hammerhead时的钩子使用方案
明确结论:独立运行hammerhead代理完全支持钩子功能,不需要修改request-pipeline源码,官方提供了和TestCafe主框架逻辑一致的非侵入式钩子注册方式。
具体实现步骤
1. 初始化Hammerhead代理实例
直接使用hammerhead封装的Proxy类创建实例(比手动初始化RequestPipeline更简便,自带完整的代理启动逻辑):
const { Proxy } = require('testcafe-hammerhead'); // 配置代理端口与主机 const proxy = new Proxy({ port: 1337, hostname: 'localhost' });
2. 注册请求/响应钩子
通过代理实例的hooks对象,直接注册各类钩子,常用的钩子类型包括onRequest、onResponse、onBeforeRequest:
示例1:修改请求头
proxy.hooks.onRequest.add((req, res, options) => { // 给所有通过代理的请求添加自定义头 req.headers['X-Custom-Proxy-Tag'] = 'standalone-hammerhead'; });
示例2:拦截并修改响应内容
proxy.hooks.onResponse.add((req, res, responseBuffer, responseHeaders) => { // 仅针对HTML响应注入自定义脚本 if (responseHeaders['content-type']?.includes('text/html')) { const modifiedContent = responseBuffer.toString().replace('</body>', '<script>console.log("Proxy injected code")</script></body>'); return Buffer.from(modifiedContent); } });
示例3:拦截请求并重定向
proxy.hooks.onBeforeRequest.add((req, res, options) => { if (req.url.includes('/deprecated-api')) { res.writeHead(302, { Location: '/v2/api' }); res.end(); return null; // 返回null终止原请求的后续处理 } });
3. 启动代理
完成钩子注册后,启动代理即可让所有配置生效:
proxy.start().then(() => { console.log('Hammerhead proxy running at http://localhost:1337'); });
关键注意事项
- 钩子按注册顺序执行,有依赖关系的钩子要注意顺序
- 部分钩子的返回值会影响流程(比如
onBeforeRequest返回null会直接终止原请求) - 钩子内尽量避免异步操作,若需异步逻辑可使用支持Promise的钩子类型
内容的提问来源于stack exchange,提问作者Ghxst
相关产品推荐
相关产品推荐

